Python开发Windows桌面应用程序(二)简单应用程序实现

2023-05-16

前言

上编blog说到用Python开发Windows桌面应用程序的环境搭建,下面就说说如何实现一个简单的远程日志读取的功能。

界面绘制

打开界面绘制工具,选中项目后,右键找到External Tools,然后选择QtDesigner

打开Qt Designer工作台,然后我们选择Main Window就可以在这个画布上尽情的绘制我们需要的界面呈现样式了

我绘制好的界面如下(远程查询Linux服务器上的日志)

我这里做的功能非常简单,连接服务器,然后查询设备对应的原始数据,这里有两个按钮,我们首先给按钮绑定点击事件

然后弹出按钮配置界面

因为我们绑定的是点击事件,所以这里选择第一个clicked()

点击最后一步的+号,创建一个点击事件,然后点击OK即可

将创建好的界面保存后,我们回到pycharm可以看到.ui文件

最后将.ui文件通过PyUIC转成对应的.py文件

最后我们看一下.py文件

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'MainForm.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1434, 790)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.B_Query = QtWidgets.QPushButton(self.centralwidget)
        self.B_Query.setGeometry(QtCore.QRect(60, 480, 141, 41))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.B_Query.setFont(font)
        self.B_Query.setObjectName("B_Query")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(20, 323, 81, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.dTE_Start = QtWidgets.QDateTimeEdit(self.centralwidget)
        self.dTE_Start.setGeometry(QtCore.QRect(100, 420, 201, 31))
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.dTE_Start.setFont(font)
        self.dTE_Start.setDate(QtCore.QDate(2020, 1, 1))
        self.dTE_Start.setObjectName("dTE_Start")
        self.E_ID = QtWidgets.QLineEdit(self.centralwidget)
        self.E_ID.setGeometry(QtCore.QRect(100, 323, 200, 30))
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.E_ID.setFont(font)
        self.E_ID.setObjectName("E_ID")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(20, 420, 81, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.E_IP = QtWidgets.QLineEdit(self.centralwidget)
        self.E_IP.setGeometry(QtCore.QRect(100, 10, 200, 30))
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.E_IP.setFont(font)
        self.E_IP.setObjectName("E_IP")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 78, 26))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.E_Psd = QtWidgets.QLineEdit(self.centralwidget)
        self.E_Psd.setGeometry(QtCore.QRect(100, 90, 200, 30))
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.E_Psd.setFont(font)
        self.E_Psd.setObjectName("E_Psd")
        self.B_Connect = QtWidgets.QPushButton(self.centralwidget)
        self.B_Connect.setGeometry(QtCore.QRect(60, 130, 141, 41))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.B_Connect.setFont(font)
        self.B_Connect.setObjectName("B_Connect")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(20, 90, 43, 26))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.E_User = QtWidgets.QLineEdit(self.centralwidget)
        self.E_User.setGeometry(QtCore.QRect(100, 50, 200, 30))
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.E_User.setFont(font)
        self.E_User.setObjectName("E_User")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(10, 55, 60, 26))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(310, 0, 1121, 781))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.textEdit = QtWidgets.QTextEdit(self.verticalLayoutWidget)
        self.textEdit.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.textEdit.setLineWidth(0)
        self.textEdit.setObjectName("textEdit")
        self.verticalLayout_3.addWidget(self.textEdit)
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(100, 370, 201, 31))
        self.comboBox.setObjectName("comboBox")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(20, 370, 81, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.B_Connect.clicked.connect(MainWindow.connectServer_click)
        self.B_Query.clicked.connect(MainWindow.queryRowData_click)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.B_Query.setText(_translate("MainWindow", "查询"))
        self.label_4.setText(_translate("MainWindow", "设备ID:"))
        self.dTE_Start.setDisplayFormat(_translate("MainWindow", "yyyy-MM-dd"))
        self.label_5.setText(_translate("MainWindow", "选择日期:"))
        self.label.setText(_translate("MainWindow", "服务器IP:"))
        self.B_Connect.setText(_translate("MainWindow", "连接"))
        self.label_3.setText(_translate("MainWindow", "密码:"))
        self.label_2.setText(_translate("MainWindow", "用户名:"))
        self.label_7.setText(_translate("MainWindow", "协议类型:"))

主方法里面实现代码如下:

#coding=gbk
#coding=utf-8
#-*- coding: UTF-8 -*

import tkinter
import tkinter.messagebox

import paramiko
from PyQt5.QtCore import QDate
from MainForm import Ui_MainWindow
from PyQt5 import QtWidgets
import sys
import re

class query_window(QtWidgets.QMainWindow):
    client=None
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.dTE_Start.setDate(QDate.currentDate())
        self.ui.comboBox.addItem('JT701')
        self.ui.comboBox.addItem('JT701-TRA')
        self.ui.comboBox.addItem('JT709A/JT705A/JT707A')
        

    #B_Connect 的 点击动作绑定一个事件处理函数
    def connectServer_click(self):
        global client
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(self.ui.E_IP.text(), 22, self.ui.E_User.text(), self.ui.E_Psd.text(), compress=True)
        root = tkinter.Tk()
        root.withdraw()
        if client != None:
            tkinter.messagebox.showinfo("提示", "连接成功")
        else:
            tkinter.messagebox.showinfo("提示", "连接失败")

    # B_Query 的 点击动作绑定一个事件处理函数
    def queryRowData_click(self):
        assetType = self.ui.comboBox.currentText()
        global logPath
        if assetType=='JT701':
            logPath="/opt/gnss/jt701-server/logs/jt701-server-"+self.ui.dTE_Start.date().toString("yyyy-MM-dd")+".log"
        elif assetType=='JT701-TRA':
            logPath = "/opt/gnss/tra701-server/logs/tra701-server-" + self.ui.dTE_Start.date().toString("yyyy-MM-dd")+ ".log"
        else:
            logPath = "/opt/gnss/jt707-server/logs/jt707-server-" + self.ui.dTE_Start.date().toString("yyyy-MM-dd")+ ".log"
        remote_file = client.open_sftp().open(logPath)
        try:
            for line in remote_file:
                if line.find("ProtocolDecoder") != -1 & line.find(self.ui.E_ID.text())!=-1:
                    result = re.findall("INFO(.*)收到:", line)
                    for rinfo in result:
                        rline = line.replace(rinfo, '').replace('INFO', '')
                        self.ui.textEdit.append(rline)
        finally:
            remote_file.close()
            self.ui.textEdit.append("END--------------------------------------------------------------------------")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = query_window()
    window.show()
    sys.exit(app.exec_())

最后运行后界面截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python开发Windows桌面应用程序(二)简单应用程序实现 的相关文章

  • 阴影检测(shadow detect)

    不管是无人机影像或者其它方式摄取的图像 xff0c 由于光照 xff0c 难免会存在阴影 xff0c 笔者这篇文章介绍检测阴影一种简单的方式 参考论文 xff1a 1 Damaged Building Detection in Aerial
  • Scipy 和opencv 计算凸包(convexHull)

    凸包 xff1a 在数学中 xff0c 在实向量空间 V 中的一组点 X 的凸包或凸包络是包含 X 的最小凸集 来自 Wikipedia 通俗的来说就是包围一组散点的最小凸边形 在 scipy spatial 和 opencv 分别有计算凸
  • python 两个小技巧将字典写入txt或者json 文件

    1 不用 json 包 先来看一个 Python 的奇淫技巧 i 61 100 s1 61 str i 这样输出的不会是 100 xff0c 毫不疑问 但是 s1 61 43 str i 43 这样输出的结果 61 str i 于是看这一条
  • 时间序列预测——ARIMA模型

    文章链接 xff1a 时间序列预测 Prophet模型 https blog csdn net beiye article details 123353123 spm 61 1001 2014 3001 5502 SPSS软件实操 ARIM
  • 基本矩阵F和本质矩阵E的详细推导

    基本矩阵F E在计算机视觉中是提纯匹配点 恢复相机位姿的一个法宝 但是它是如何得到的 下面笔者做其简单的推导 如图下图 xff0c 两视几何图 其中C和C 分别代表左 右摄影中心 xff0c x和x 代表同名像点 xff0c e和e 代表极
  • [ubuntu]安装并使用python 3.6及与2.7的切换

    当前使用ubuntu14 04 1 添加python3 6安装包 xff0c 并安装 xff08 也可以去官网下载安装包 xff09 linux 报错E Unable To Locate Package Software propertie
  • Python + Requests 模拟登陆(含验证码)

    其实模拟登陆非常简单 xff0c 只要在打开网站的同时提交数据就可以了 下面通过登陆超星网来举例说明如何一步步实现模拟登陆 1 获取需要提交的数据 使用chrome的Network或者fiddler可以很轻易的得到我们想要的数据 xff0c
  • Cmake实现递归cpp和h

    为解决获取编译链所有C 43 43 源文件和头文件 Cmake实现递归目录 编程心得 拾随小笺
  • 鉴权 前后端常见的几种鉴权方式

    https juejin cn post 6844903927100473357 鉴权 xff08 authentication xff09 是指验证用户是否拥有访问系统的权利 传统的鉴权是通过密码来验证的 这种方式的前提是 xff0c 每
  • curl指令模拟postman发json数据,发本地文件

    菜鸟curl指令介绍 xff1a https www coonote com linux linux cmd curl html post formdata多个参数 多个参数可以使用 F进行串接 curl span class token
  • 最全的HTTP(get post)请求示例, 包括post模拟get请求

    public class HttpRequest private static SimpleDateFormat sdf 61 new SimpleDateFormat 34 yyyyMMddHHmmss 34 private static
  • python爬虫——模拟登陆

    参考链接 xff1a https blog csdn net weixin 39875941 article details 109878457 模拟登陆 Python网络爬虫应用十分广泛 xff0c 但是有些网页需要用户登陆后才能获取到信
  • vector数组 传递 引用 指针 参数

    一 一维 span class hljs stl container span class hljs built in vector span lt span class hljs keyword int span gt span vec
  • Oracle # 字符串匹配函数(Oracle、SQLSERVER、Excel)

    引言 xff1a 当数据库设置字段的时候 xff0c 会设置1表XXX xff1b 0表示XXX 查询的时候怎么显示汉字呢 xff1f Oracle数据库 xff1a 普通查询数据 xff1a select from U ORANGEZAT
  • 时间序列预测——Prophet模型

    文章链接 xff1a 时间序列预测 ARIMA模型 https blog csdn net beiye article details 123317316 spm 61 1001 2014 3001 5502 1 Propht模型概述 Pr
  • 机器人导航——路径跟踪

    要完成一套完整的机器人路径规划 xff0c 并完成其物理实验并非一件简单的事情 参考 xff1a http wenku baidu com link url 61 n11mP6EDlM78NZYZ4yQYXzmzPeBV6BeLNOUjIv
  • python 读取txt出现\xef\xbb\xbf…的问题

    用python读取txt文件 xff0c 文件的内容是一列数如下 xff1a 1883 1886 1900 1900 1897 1897 1897 1897 1906 1917 1910 1910 但是读取的时候第一个元素为 xef xbb
  • (算法)判断两个区间是否重叠

    题目 xff1a 判断两个区间是否重叠 思路 xff1a 假设区间表示为 start end xff0c 先存在两个区间A B 两个区间的关系有两种 xff1a 重叠与不重叠 重叠的情况有4种 xff0c 两种相交 xff0c 两种包含 x
  • python ctrl+c 退出while True:

    写了一个死循环 xff0c 类似 xff1a def function while True my code 程序运行后想用ctrl 43 c按键停止程序 xff0c 可是终止不了 以下为解决办法 xff1a 第一步 xff1a 加入sys
  • python二维字典

    感谢原文 xff1a http www jb51 net article 83108 htm 本文实例讲述了Python的 二维 字典 two dimension dictionary 定义与实现方法 分享给大家供大家参考 xff0c 具体

随机推荐