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

最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。
PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI 库之一,使用 PyQt5 我们能够很容易的开发桌面应用,接下来我们将用它来开发一个下载服务器日志文件的小程序。
前期准备

Program:/Users/macbookpro/workspace/projects/DownloadServerLog/venv/bin/python3.9Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.pyWorking directory:/Users/macbookpro/workspace/projects/DownloadServerLog/ui
实操步骤
1. 创建项目
DownloadServerLog├── app│ ├── downloadlog.py│ └── downloadlog_qtui.py├── main.py└── ui│ └── downloadlog_qtui.ui├── .env
2.使用 QtDesigner?设计界面

3. 使用 ui 生成对应的 py 文件

4. 新建 main.py 作为程序入口
import sysfrom PyQt5 import QtCorefrom PyQt5.QtCore import QObject, pyqtSignalfrom PyQt5.QtWidgets import QApplication, QMainWindowfrom threading import Threadfrom app.downloadlog_qtui import Ui_Dialogfrom app.downloadlog import DownloadLogclass 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.translateself.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_())
5. 下载
通过 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 hostself.sftp.get(remotepath=self.remote_path, localpath=self.local_path)
6. 展示下载过程
class CommunicateSignal(QObject):text_print = pyqtSignal(str)
# 自定义信号处理函数self.comm_signal = CommunicateSignal()self.comm_signal.text_print.connect(self.show_text)
# 通过该信号对象的 emit 方法发出信号,emit 方法的参数传递必要的数据。# 参数类型遵循定义 Signal 时指定的类型。self.comm_signal.text_print.emit(text)
def show_text(self, text):"""将文本内容追加到程序「展示框」"""self.textBrowser.append(text)
7. 效果展示


总结
资料参考:
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/
快 来 找 又 小 拍

推?荐 阅 读 


设为星标

更新不错过




设为星标

更新不错过
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 中共中央召开党外人士座谈会 7904726
- 2 贪污超11亿!白天辉被执行死刑 7809346
- 3 日本强震 高市早苗神色慌张一路小跑 7714130
- 4 全国首艘氢电拖轮作业亮点多 7618998
- 5 王毅:是可忍孰不可忍 7521858
- 6 《大明王朝1566》逆袭成国产剧天花板 7428893
- 7 河北沧州杀妻案男方被判死刑 7332302
- 8 日本发生7.5级强震后 高市早苗发声 7236699
- 9 水银体温计将于2026年禁产 7135726
- 10 “人造太阳”何以照进现实 7042407







又拍云
