【实操日记】使用 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 澳门是伟大祖国的一方宝地 7934394
- 2 日本火山喷发灰柱高达3400米 7923960
- 3 女子穿和服在南京景区拍照遭怒怼 7872773
- 4 2024 向上的中国 7701214
- 5 肖战新片射雕英雄传郭靖造型曝光 7691797
- 6 男子钓上一条自带“赎金”的鱼 7515499
- 7 胡锡进与你聊聊2024 7449008
- 8 大三女生练咏春一起手眼神骤变 7342107
- 9 赵丽颖带儿子探班 7253555
- 10 高考601分女生为何选择殡葬专业 7105375