MyWindow 作为主窗口程序,程序初始化时会将 self.click_download 方法注册到 下载 按钮的点击事件,并自动调用 self.set_window_init_data 方法来设置输入框初始值 。
5. 下载下载日志程序 DownloadLog 定义在 app/downloadlog.py 中,远程下载文件主要步骤有两步:
- 通过 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 强大的能力,我们可以通过“拖拉拽”的形式很容易地实现桌面端程序,只需要将原来的 Python 脚本绑定到 UI 程序的事件中,就实现了命令行程序到桌面程序的演进 。接下来你可以根据自己的需求来定制自己的桌面小程序啦~
资料参考:
经验总结扩展阅读
- 2023国庆节的祝福语给祖国60句
- 2023年1月24日安置床铺黄道吉日 2023年1月24日安置床铺行吗
- 2024腊八节快乐祝福语76句
- 2023年1月24日盖楼黄道吉日 2023年1月24日是盖楼吉日吗
- 2023年1月24日封顶行吗 2023年农历正月初三封顶吉日
- 法国轻奢品牌Agatha手表
- 2023年1月24日酬神好不好 2023年1月24日适合酬神吗
- 无线游戏手柄-安卓无线蓝牙游戏手柄怎么用
- 2023年1月24日适合还愿吗 2023年1月24日还愿黄道吉日
- 冷天雷是什么电影中的人物?