最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。

PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI 库之一,使用 PyQt5 我们能够很容易的开发桌面应用,接下来我们将用它来开发一个下载服务器日志文件的小程序。

前期准备

软件

  • QT5
    Python 模块
  • PyQt5==5.15.7
  • paramiko==2.9.2
    PyCharm 添加扩展工具 PyUIC
    PyUIC 扩展用于将使用 Qt Designer 生成的 ui 文件转成 py 文件,可以在 PyCharm 中通过 Preferences-Tools-External Tools 进行配置,截图如下:

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 项目,设计程序结构如下:

DownloadServerLog
├── app
│   ├── downloadlog.py
│   └── downloadlog_qtui.py
├── main.py
└── ui
│   └── downloadlog_qtui.ui
├── .env

main.py 作为程序入口文件,.env 存放环境变量,ui 存放使用 Qt Designer 设计界面导出的源码文件,app 存放下载程序文件。

2.使用 QtDesigner 设计界面

Qt Designer 使用起来非常简单,可以通过“拖拉拽”的形式生成 UI 界面(文档:https://doc.qt.io/qtcreator/creator-using-qt-designer.html),设计界面如下:

这个程序功能一目了然,左侧几个输入框用于输入必要的信息,右侧一个展示框用于展示程序实时日志。界面设计好后可以将其保存至项目 DownloadServerLog 下的 ui 目录下 downloadlog_qtui.ui,供后续使用。

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

使用 PyCharm 打开项目,在 downloadlog_qtui.ui 文件上右键,选择 External Tools 使用 PyUIC 根据 ui 文件生成对应的 py 文件 downloadlog_qtui.py,将文件存放至 app 目录。

4. 新建 main.py 作为程序入口

在项目根目录下创建 main.py 文件:

import sysfrom PyQt5 import QtCore
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from threading import Threadfrom app.downloadlog_qtui import Ui_Dialog
from 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_())

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 强大的能力,我们可以通过“拖拉拽”的形式很容易地实现桌面端程序,只需要将原来的 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/

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

  1. php 下载脱离服务器,php 自动下载远程服务器文件

    摘要 腾兴网为您分享:php 自动下载远程服务器文件,桌面时钟,银联商务,小番茄,喜马拉雅等软件知识,以及中山安全,司机之家,四川金穗服务,的语音合成,包头交警,thor过滤器,魔术教学视频简单,怒熊 ...

  2. php fopen 图片下载,php curl与fopen下载远程服务器图片实例

    本文章来给大家介绍php curl与fopen下载远程服务器图片实例代码,有需要的朋友可参考. fopen函数  代码如下 复制代码 function get_file($url,$folder,$p ...

  3. Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复)

    Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复) 网课传送门:https://www.bilibili.com/video/BV1Sw411Z779?p=168& ...

  4. 上传/下载远程服务器文件

    需求说明   有时候我们需要对我们远程服务器的文件进行上传/下载功能,或者是我们拿到国外的Chicken了需要上传我们的Trojan来进行长久控制,再或者我们需要方便的拿到我们远程服务器上某某文件/文 ...

  5. [ SHELL编程 ] 远程服务器传输文件

    在shell编程中经常需要获取远程服务器文件.手工操作中使用scp命令完成.为避免脚本执行scp输入密码进行交互,需先建立本机服务器当前用户和远程服务器指定用户的信任关系.具体代码见操作实例,重点关注 ...

  6. 易语言 上传文件到远程服务器,易语言与向远程服务器发送文件夹

    易语言与向远程服务器发送文件夹 内容精选 换一换 一.IDEA连接SSH 确认你的密码输对了,还好我保存了我的远程服务器的密码,原先我一直以为我输对了,导致一直报错Auth fail 点击ok,连接上 ...

  7. 服务器上复制文件到本地会有什么,scp将远程服务器上文件拷贝到本地

    scp将远程服务器上文件拷贝到本地 内容精选 换一换 1.openssh简介:用于远程连接服务器主机,通信过程和认证过程都是加密的,比telnet更安全.2.openssh版本:v1版本:无法防范中间 ...

  8. java怎么获取服务器文件夹,java获取远程服务器的文件夹

    java获取远程服务器的文件夹 内容精选 换一换 工具中所有涉及上传文件功能的,如果需要上传的文件大于1GB或者解压后超过剩余磁盘空间的一半,则需要释放磁盘空间或手动将文件上传至服务器,其他情况可通过 ...

  9. java拷贝远程服务器上文件,java拷贝远程服务器上文件

    java拷贝远程服务器上文件 内容精选 换一换 在Windows模式下,调试功能暂不可用.为支持多交叉架构的调试场景,需要在安装MindStudio的服务器(UI Host)上安装gdb-multia ...

最新文章

  1. 5行Python提取海量新闻网站内容
  2. 学习在Unity中创建一个动作RPG游戏
  3. PAT甲级1108 Finding Average :[C++题解]stof、字符串变成浮点数、try和catch捕获异常、C++语法题
  4. 【django】配置Jinja2模板引擎【2】
  5. ERROR 1093 解决方法
  6. dockerclient 查看端口占用_docker 端口被占用问题解决
  7. netcore实践:跨平台动态加载native组件
  8. nsoutlineview 搜索_阿里巴巴搜索推荐广告三位一体的在线服务体系
  9. 浅谈分布式计算的开发与实现(二)
  10. Exchange 2003 RPC over Http
  11. 企业组织形态及财务报表
  12. 记录Elastic Job服务处于下线状态排查
  13. 鼎新TIPTOP GP/鼎捷易拓ERP系统介绍
  14. 飞思卡尔全国总决赛智能车决赛赛道分析
  15. Office2010新体验-基于Office Visio 2010 图表绘制新体验
  16. Android平台音视频RTMP推送|GB28181对接之动态水印设计
  17. 上海落户计算机水平毕业研究生,2021上海积分落户应届毕业生直接落户上海
  18. android之父:安迪*鲁宾
  19. c mysql加密解密_mysql内置加密函数对数据加密
  20. 悬崖寻路问题Sarsa和QLearning实现

热门文章

  1. 微信 新西兰服务器,在新西兰,他们用微信,这样打发一个寂寞的周末
  2. [转载]关于浙江大学新校长人选的另一种声音
  3. 论文阅读“Robust multi-view clustering with incomplete information”
  4. Java密钥库及keytool使用详解
  5. 一建加试英语和计算机,一建和一造哪个考试难度大
  6. 获取osc动弹中人员的用户名,并@他,so easy
  7. 手把手教你python作词云,不断更新内容,有问题可以互相交流哦
  8. 记某hw中遇到的cms漏洞(PageAdmin CMS)渗透过程
  9. Oracle Primavera P6软件项目进度报告
  10. 关于手机端TeamViewer需要验证账户的解决方案