最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。
PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI 库之一,使用 PyQt5 我们能够很容易的开发桌面应用,接下来我们将用它来开发一个下载服务器日志文件的小程序。
前期准备
软件- QT5Python 模块- PyQt5==5.15.7- paramiko==2.9.2PyCharm 添加扩展工具 PyUICPyUIC 扩展用于将使用 Qt Designer 生成的 ui 文件转成 py 文件,可以在 PyCharm 中通过 Preferences-Tools-External Tools 进行配置,截图如下:
Program:/Users/macbookpro/workspace/projects/DownloadServerLog/venv/bin/python3.9
Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
Working directory:/Users/macbookpro/workspace/projects/DownloadServerLog/ui
实操步骤
1. 创建项目
创建 DownloadServerLog 项目,设计程序结构如下:
DownloadServerLog
├── app
│ ├── downloadlog.py
│ └── downloadlog_qtui.py
├── main.py
└── ui
│ └── downloadlog_qtui.ui
├── .env
main.py 作为程序入口文件,.env 存放环境变量,ui 存放使用 Qt Designer 设计界面导出的源码文件,app 存放下载程序文件。
2.使用 QtDesigner设计界面
Qt Designer 使用起来非常简单,可以通过“拖拉拽”的形式生成 UI 界面(文档:https://doc.qt.io/qtcreator/creator-using-qt-designer.html),设计界面如下:这个程序功能一目了然,左侧几个输入框用于输入必要的信息,右侧一个展示框用于展示程序实时日志。界面设计好后可以将其保存至项目 DownloadServerLog 下的 ui 目录下 downloadlog_qtui.ui,供后续使用。3. 使用 ui 生成对应的 py 文件
使用 PyCharm 打开项目,在 downloadlog_qtui.ui 文件上右键,选择 External Tools 使用 PyUIC 根据 ui 文件生成对应的 py 文件 downloadlog_qtui.py,将文件存放至 app 目录。4. 新建 main.py 作为程序入口
在项目根目录下创建 main.py 文件:
import sys
from PyQt5 import QtCore
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from threading import Thread
from app.downloadlog_qtui import Ui_Dialog
from app.downloadlog import DownloadLog
class CommunicateSignal(QObject):
text_print = pyqtSignal(str)
# MyWindow 是主窗口程序,继承自 PyQt5.QtWidgets.QMainWindow
# 和通过 ui 文件生成的 downloadlog_qtui.py 中的 Ui_Dialog 类
class MyWindow(QMainWindow, Ui_Dialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.btn_download.clicked.connect(self.click_download)
# 自定义信号处理函数
self.comm_signal = CommunicateSignal()
self.comm_signal.text_print.connect(self.show_text)
self.set_window_init_data()
def set_window_init_data(self):
"""设置程序窗体初始值"""
# 从 .env 读取环境变量
result_dict = dict()
with open('.env', 'r', encoding='utf-8') as f:
for line in f.readlines():
key = line.split('=')[0].strip()
value = line.split('=')[-1].strip()
result_dict[key] = value
# 设置输入框值
_translate = QtCore.QCoreApplication.translate
self.host.setText(_translate("Dialog", result_dict.get("HOST", '')))
self.port.setText(_translate("Dialog", result_dict.get("PORT", '22')))
self.username.setText(_translate("Dialog", result_dict.get("USERNAME", 'root')))
self.password.setText(_translate("Dialog", result_dict.get("PASSWORD", '')))
self.directory.setPlainText(_translate("Dialog", result_dict.get("DIRECTORY", '')))
self.startTime.setDate(QtCore.QDate.currentDate())
self.endTime.setDate(QtCore.QDate.currentDate())
def get_window_input_value(self):
"""获取程序各「输入框」组件值"""
return {
"host": self.host.text(),
"port": self.port.text(),
"username": self.username.text(),
"password": self.password.text(),
"directory": self.directory.toPlainText(),
"start_time": self.startTime.date().toString("yyyy-MM-dd"),
"end_time": self.endTime.date().toString("yyyy-MM-dd"),
"suffix": ".log",
}
def show_text(self, text):
"""将文本内容追加到程序「展示框」"""
self.textBrowser.append(text)
def click_download(self):
"""处理点击「下载」按钮事件"""
params = self.get_window_input_value()
def run():
res = DownloadLog(conn_type='ssh', comm_signal=self.comm_signal, **params)
res.main()
t = Thread(target=run)
t.start()
if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyWindow()
myWin.show()
sys.exit(app.exec_())
MyWindow 作为主窗口程序,程序初始化时会将 self.click_download 方法注册到 下载 按钮的点击事件,并自动调用 self.set_window_init_data 方法来设置输入框初始值。
5. 下载
下载日志程序 DownloadLog 定义在 app/downloadlog.py 中,远程下载文件主要步骤有两步:- 通过 SSH 登录远程服务器
- 通过 FTP 进行文件下载
class DownloadLog(object):
def __init__(self, **kwargs):
"""初始化一些参数"""
...
def main(self):
# 获取 Transport 实例
tran = paramiko.Transport((self.host, int(self.port)))
# 连接 SSH 服务端
tran.connect(username=self.username, password=self.password)
# 创建 SFTP 实例
self.sftp = paramiko.SFTPClient.from_transport(tran)
# 下载文件
# :param str remotepath: the remote file to copy
# :param str localpath: the destination path on the local host
self.sftp.get(remotepath=self.remote_path, localpath=self.local_path)
6. 展示下载过程
为了将下载程序执行步骤实时展示到输出框,这里需要引入 PyQt5 的信号处理机制。由于 PyQt 建议只在主线程中操作界面,可以发现我们在 main.py 中调用 DownloadLog.main 方法时创建了一个新的线程。所有的 GUI 程序都是事件驱动的,事件可能由用户触发,比如点击 下载 按钮事件,也可能由程序触发,比如我们现在要实现的展示下载过程的功能,就需要使用程序主动触发事件。在 PyQt5 中通过 Signal 信号来处理事件,其基本使用步骤如下:自定义一个 CommunicateSignal 类,继承自 PyQt5 的 QObject 类,里面封装自定义的 Signal 信号(Signal 实例对象的初始化参数指定的类型,就是发出信号对象时,传递的参数数据类型。因为 PyQt5 底层是 C++ 开发的,必须指定类型)。
class CommunicateSignal(QObject):
text_print = pyqtSignal(str)
定义主线程执行的函数处理 Signal 信号(通过 connect 方法绑定)。
# 自定义信号处理函数
self.comm_signal = CommunicateSignal()
self.comm_signal.text_print.connect(self.show_text)
在 DownloadLog 线程需要操作界面的时候,就通过自定义对象(CommunicateSignal)发出信号(使用 emit 方法发出信号),所以在实例化 DownloadLog 时会将 comm_signal 传递进去。
# 通过该信号对象的 emit 方法发出信号,emit 方法的参数传递必要的数据。
# 参数类型遵循定义 Signal 时指定的类型。
self.comm_signal.text_print.emit(text)
主线程信号处理函数,被触发执行,获取 Signal 里面的参数,执行必要的更新界面操作,这里将每次通过事件传过来的文本内容展示到输出框内。
def show_text(self, text):
"""将文本内容追加到程序「展示框」"""
self.textBrowser.append(text)
7. 效果展示
通过以上步骤我们完成的程序设计,现在可以验证下这个下载日志文件的小程序了:查看下载结果:总结
我们通过 PyQt5 实现了一个下载远程服务器日志文件的小程序,其实它不止可以用来下载日志,同样可以用来下载其他文件。借助 PyQt5 强大的能力,我们可以通过“拖拉拽”的形式很容易地实现桌面端程序,只需要将原来的 Python 脚本绑定到 UI 程序的事件中,就实现了命令行程序到桌面程序的演进。接下来你可以根据自己的需求来定制自己的桌面小程序啦~
审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
服务器
+关注
关注
11文章
6869浏览量
81564 -
GUI
+关注
关注
3文章
553浏览量
38324
发布评论请先 登录
相关推荐
【Firefly RK3399试用体验】第二篇:PyQt5大战点灯
文件名,它会列出相关的包,例如我们要安装PyQt5,我们可以试试apt search pyqt5可以看到,源里包并不以pyqt5简单命名,而是使用python-pyqt5命名找到了安装的
发表于 06-12 07:49
【Firefly RK3399试用体验】PyQt5信号检测系统(结项)
PyQt显示的内部通道波形的FFT由于手里没有信号源等啥设备,只好用直流电压进行测试,channel0,如下所示接下来重点阐述PyQt5部分设计,PyQt5部分涉及到网口通信部分我
发表于 07-13 12:55
Dragonbaord 410c Python交互设计:利用pyQt搭建交互程序界面
文件 pyuic5.bat 界面转换器,用设计师设计的.ui文件可以通过该工具进行转换生成Python脚本。 了解上面的文档和工具后,就可以使用pyqt来进行开发
发表于 09-25 15:07
PLC远程下载调试加速服务器介绍
服务器,远程下载,调试PLC程序和触摸屏程序速度提高30%以上。同时可以很好解决远程维护出口设备,网络通道上“墙”的问题。您可以在全球任何一个角落,下载,维护,调试您的控制系...
发表于 07-02 07:36
利用PyQt5编辑软件界面的简单步骤
PyQt5编辑软件界面的简单步骤。实现难度不大,但需要运行第二线程运行输出脉冲的程序。 首先,推荐一下PyQt5和Eric6的学习资料...
发表于 09-16 07:48
鲁班猫0 ubuntu20 解决python3.10安装pyqt5
pyqt5,总是安装不成功。经查阅资料,最后用:udo apt install python3-pyqt5成功安装cat@lubancat:~$
发表于 04-09 11:04
PyQt5的中文教程电子书免费下载
PyQt5。教程内所有代码都在Linux上测试通过。PyQt4 教程是PyQt4的教程,PyQt4是一个Python(同时支持 2和3)版的Qt库。
发表于 08-06 08:00
•10次下载
使用pycharm开发上位机配置pyqt5的环境
pyqt5和pyqt5-tools,安装方式:右上角的设置->项目->python解释器->软件包上面的加号,点 击后搜索就可以了,
发表于 05-29 16:12
•0次下载
Python PyQt5工具在Windows平台上的安装方法
PyQt5工具安装步骤:1. 安装Python3.4.1,默认安装路径:C:\Python34;2. 安装PyQt5,会根据Python的安装路径自动进行安装,不需要修改;3. 测试安装是否成功。创建一个py文件,写入以下代码,运行后弹出widget窗口就说明安装成功了。
发表于 02-13 10:45
•2413次阅读
PyQT5+OpenCV开发的应用如何打包发布?
PyQT5写了一个应用程序,基本上都写好了,到了打包发布这个环节,我知道的有两个工具可以帮我打包分别是。
请问PyQT5是如何构建YOLOv8界面应用程序的
PyQT5中引用OpenMV2023版本支持SDK,实现二次开发使用。OpenMV算法层已经开放SDK调用支持,从图像处理、分析、测量到深度学习推理全部支持SDK调用方式实现第三方应用与程序集成。
Mac怎么连接远程服务器?
远程服务器将允许用户访问特定服务器上的所有可用文件。默认情况下,macOS具有服务器连接功能,可供用户使用 Mac在没有任何限制的情况下连接到任何服务器。然后,它Finder显示为用户访问、使用甚至删除文件的普通磁盘驱动器Mac如何连接
评论