最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。 PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI 库之一,使用
| 最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。 PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI 库之一,使用 PyQt5 我们能够很容易的开发桌面应用,接下来我们将用它来开发一个下载服务器日志文件的小程序。 前期准备软件 
 PyUIC 扩展用于将使用 Qt Designer 生成的 ui 文件转成 py 文件,可以在 PyCharm 中通过 Preferences-Tools-External Tools 进行配置,截图如下: 
 
 实操步骤1. 创建项目创建 DownloadServerLog 项目,设计程序结构如下: 
 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 文件: 
 MyWindow 作为主窗口程序,程序初始化时会将 self.click_download 方法注册到 下载 按钮的点击事件,并自动调用 self.set_window_init_data 方法来设置输入框初始值。 5. 下载下载日志程序 DownloadLog 定义在 app/downloadlog.py 中,远程下载文件主要步骤有两步: 
 这里采用 paramiko 来实现远程下载功能,paramiko 是一个纯 Python 库,它实现了 SSHv2 协议,提供了 SSH 和 FTP 的能力。 核心代码如下,读者可以根据自己的需求实现 DownloadLog: 
 6. 展示下载过程为了将下载程序执行步骤实时展示到输出框,这里需要引入 PyQt5 的信号处理机制。 由于 PyQt 建议只在主线程中操作界面,可以发现我们在 main.py 中调用 DownloadLog.main 方法时创建了一个新的线程。 所有的 GUI 程序都是事件驱动的,事件可能由用户触发,比如点击 下载 按钮事件,也可能由程序触发,比如我们现在要实现的展示下载过程的功能,就需要使用程序主动触发事件。 在 PyQt5 中通过 Signal 信号来处理事件,其基本使用步骤如下: 自定义一个 CommunicateSignal 类,继承自 PyQt5 的 QObject 类,里面封装自定义的 Signal 信号(Signal 实例对象的初始化参数指定的类型,就是发出信号对象时,传递的参数数据类型。因为 PyQt5 底层是 C++ 开发的,必须指定类型)。 
 定义主线程执行的函数处理 Signal 信号(通过 connect 方法绑定)。 
 在 DownloadLog 线程需要操作界面的时候,就通过自定义对象(CommunicateSignal)发出信号(使用 emit 方法发出信号),所以在实例化 DownloadLog 时会将 comm_signal 传递进去。 
 主线程信号处理函数,被触发执行,获取 Signal 里面的参数,执行必要的更新界面操作,这里将每次通过事件传过来的文本内容展示到输出框内。 
 7. 效果展示通过以上步骤我们完成的程序设计,现在可以验证下这个下载日志文件的小程序了: 
 查看下载结果: 
 总结我们通过 PyQt5 实现了一个下载远程服务器日志文件的小程序,其实它不止可以用来下载日志,同样可以用来下载其他文件。 资料参考:https://download.qt.io/archive/qt/5.14/5.14.2/ https://doc.qt.io/qtcreator/creator-using-qt-designer.html https://docs.paramiko.org/en/stable/ | 
2019-06-18
2019-07-04
2021-05-23
2021-05-27
2021-05-27