当前位置: 首页 > Web前端 > HTML

【练习日记】使用PyQt5设计一个下载远程服务器日志文件的程序

时间:2023-03-28 10:43:30 HTML

最近设计了一个通过PyQt5下载指定日期的服务器日志文件的程序。里面有一些比较有意思的技术点,现在分享一些。PyQt5是一个用于将DigiaQt5应用程序与Python绑定的框架。它是最强大的GUI库之一。使用PyQt5,我们可以轻松开发桌面应用程序。接下来,我们将用它来开发一个下载服务器日志文件的小程序。前期准备软件QT5Python模块PyQt5==5.15.7paramiko==2.9.2PyCharm添加扩展工具PyUICPyUIC扩展用于将QtDesigner生成的ui文件转换为py文件,在PyCharm中可以通过Preferences-Tools-进行配置外部工具,截图如下:程序:/Users/macbookpro/workspace/projects/DownloadServerLog/venv/bin/python3.9参数:-mPyQt5.uic.pyuic$FileName$-o$FileNameWithoutExtension$.py工作目录:/Users/macbookpro/workspace/projects/DownloadServerLog/ui实用步骤1.创建工程创建一个DownloadServerLog工程,设计程序结构如下:DownloadServerLog├──app│├──downloadlog.py│└──downloadlog_qtui.py├──main.py└──ui│└──downloadlog_qtui.ui├──.envmain.py作为程序入口文件,.env用于存放环境变量,ui用于存放导出的源代码文件使用QtDesigner设计界面,app用于存放下载的程序文件。2、使用QtDesigner设计界面QtDesigner使用起来非常简单,通过“拖放”即可生成UI界面(文档:https://doc.qt.io/qtcreator/c...),设计界面如下:这个程序的功能一目了然。左边的输入框用来输入必要的信息,右边的显示框用来显示程序的实时日志。界面设计好后,可以保存到项目DownloadServerLog的ui目录下的downloadlog_qtui.ui,以供后续使用。3、使用ui生成对应的py文件使用PyCharm打开项目,右键点击downloadlog_qtui.ui文件,选择ExternalTools,使用PyUIC根据ui文件生成对应的py文件downloadlog_qtui.py,并存入app目录下的文件。4.新建一个main.py作为程序入口,在项目根目录下新建一个main.py文件:importUi_app.DialogloadfromimportDownloadLogclassCommunicateSignal(QObject):text_print=pyqtSignal(str)#MyWindow是主窗口程序,继承自PyQt5.QtWidgets.QMainWindow#和通过ui文件MyWindow(QMainWindow)生成的downloadlog_qtui.py中的Ui_Dialog类类,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()自己。comm_signal.text_print.connect(self.show_text)self.set_window_init_data()defset_window_init_data(self):"""设置程序窗口的初始值"""#从.env中读取环境变量result_dict=dict()withopen('.env','r',encoding='utf-8')asf:forlineinf.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())defget_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",}defshow_text(self,text):"""添加文本内容到程序“显示框架”“””self.textBrowser.append(text)defclick_download(self):"""处理点击“下载”按钮的事件"""params=self.get_window_input_value()defrun():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作为主窗口window程序,在程序初始化时,会向下载按钮的点击事件注册self.click_download方法,并自动调用self.set_window_init_data方法设置输入框的初始值。5、下载下载日志程序DownloadLog定义在app/downloadlog.py中,远程下载文件主要有两个步骤:通过SSH登录远程服务器,通过FTP下载文件。这里使用paramiko实现远程下载功能。Paramiko是一个纯Python库,实现了SSHv2协议,提供SSH和FTP能力。核心代码如下,读者可以根据自己的需要实现DownloadLog:classDownloadLog(object):def__init__(self,**kwargs):"""初始化一些参数"""...defmain(self):#GetTransportExampletran=paramiko.Transport((self.host,int(self.port)))#连接到SSH服务器tran.connect(username=self.username,password=self.password)#创建SFTP实例self.sftp=paramiko.SFTPClient.from_transport(tran)#下载文件#:paramstrremotepath:要复制的远程文件#:paramstrlocalpath:本地主机上的目标路径self.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++开发的,所以必须指定类型)。classCommunicateSignal(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中的参数,进行必要的界面更新操作。在这里,通过每个事件传递的文本内容显示在输出框中。defshow_text(self,text):"""将文本内容附加到程序"显示框"""self.textBrowser.append(text)7.效果展示了我们通过以上步骤完成的程序设计,现在我们可以验证一下下载日志文件的小程序:查看下载结果:总结我们通过PyQt5实现了一个下载远程服务器日志文件的小程序,其实它不仅可以用来下载日志,还可以用来下载其他的文件。借助PyQt5的强大能力,我们可以轻松实现“拖拽”形式的桌面程序。我们只需要将原来的Python脚本绑定到UI程序的事件上,就可以实现从命令行程序到桌面程序的进化。.接下来大家可以根据自己的需求自定义自己的桌面小程序啦~资料参考:https://download.qt.io/archiv...https://doc.qt.io/qtcreator/c...https://docs.paramiko.org/en/…