【实操日记】使用 PyQt5 设计下载远程服务器日志文件程序( 二 )

MyWindow 作为主窗口程序,程序初始化时会将 self.click_download 方法注册到 下载 按钮的点击事件,并自动调用 self.set_window_init_data 方法来设置输入框初始值 。
5. 下载下载日志程序 DownloadLog 定义在 app/downloadlog.py 中,远程下载文件主要步骤有两步:

  • 通过 SSH 登录远程服务器
  • 通过 FTP 进行文件下载
这里采用 paramiko 来实现远程下载功能 , paramiko 是一个纯 Python 库,它实现了 SSHv2 协议,提供了 SSH 和 FTP 的能力 。
核心代码如下,读者可以根据自己的需求实现 DownloadLog:
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 hostself.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 设计下载远程服务器日志文件程序

文章插图
总结我们通过 PyQt5 实现了一个下载远程服务器日志文件的小程序,其实它不止可以用来下载日志,同样可以用来下载其他文件 。借助 PyQt5 强大的能力,我们可以通过“拖拉拽”的形式很容易地实现桌面端程序,只需要将原来的 Python 脚本绑定到 UI 程序的事件中,就实现了命令行程序到桌面程序的演进 。接下来你可以根据自己的需求来定制自己的桌面小程序啦~
资料参考:
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/

推荐阅读