【实操日记】使用 PyQt5 设计下载远程服务器日志文件程序
最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。
PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI 库之一,使用 PyQt5 我们能够很容易的开发桌面应用,接下来我们将用它来开发一个下载服务器日志文件的小程序。
前期准备
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
├── app
│ ├── downloadlog.py
│ └── downloadlog_qtui.py
├── main.py
└── ui
│ └── downloadlog_qtui.ui
├── .env
2.使用 QtDesigner 设计界面
3. 使用 ui 生成对应的 py 文件
4. 新建 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_())
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 host
self.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 习近平拉美之行的三个“一” 7961544
- 2 山里藏价值6000亿元黄金?村民发声 7993093
- 3 微信或史诗级“瘦身” 内存有救了 7895275
- 4 中国主张成为G20峰会的一抹亮色 7756131
- 5 朝鲜将军队提升至战斗准备状态 7606141
- 6 广东潮汕现“关门潮”?社区回应 7565083
- 7 女教师被指出轨学生 校方通报 7473222
- 8 带96岁母亲酒店养老遭拉黑 男子发声 7381121
- 9 男子解锁“滑步下泰山”技能 7258123
- 10 千年古镇“因网而变、因数而兴” 7146133