最近通過 PyQt5 設計了一個下載服務器指定日期日志文件的程序,里面有些有意思的技術點,現(xiàn)在做一些分享。
PyQt5 是一套 Python 綁定 Digia Qt5 應用的框架,是最強大的 GUI 庫之一,使用 PyQt5 我們能夠很容易的開發(fā)桌面應用,接下來我們將用它來開發(fā)一個下載服務器日志文件的小程序。
前期準備
軟件- QT5Python 模塊- PyQt5==5.15.7- paramiko==2.9.2PyCharm 添加擴展工具 PyUICPyUIC 擴展用于將使用 Qt Designer 生成的 ui 文件轉(zhuǎn)成 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. 創(chuàng)建項目
創(chuàng)建 DownloadServerLog 項目,設計程序結構如下:
DownloadServerLog
├── app
│ ├── downloadlog.py
│ └── downloadlog_qtui.py
├── main.py
└── ui
│ └── downloadlog_qtui.ui
├── .env
main.py 作為程序入口文件,.env 存放環(huán)境變量,ui 存放使用 Qt Designer 設計界面導出的源碼文件,app 存放下載程序文件。
2.使用 QtDesigner設計界面
Qt Designer 使用起來非常簡單,可以通過“拖拉拽”的形式生成 UI 界面(文檔:https://doc.qt.io/qtcreator/creator-using-qt-designer.html),設計界面如下:
這個程序功能一目了然,左側(cè)幾個輸入框用于輸入必要的信息,右側(cè)一個展示框用于展示程序?qū)崟r日志。界面設計好后可以將其保存至項目 DownloadServerLog 下的 ui 目錄下 downloadlog_qtui.ui,供后續(xù)使用。
3. 使用 ui 生成對應的 py 文件
使用 PyCharm 打開項目,在 downloadlog_qtui.ui 文件上右鍵,選擇 External Tools 使用 PyUIC 根據(jù) ui 文件生成對應的 py 文件 downloadlog_qtui.py,將文件存放至 app 目錄。
?
?4. 新建 main.py 作為程序入口
在項目根目錄下創(chuàng)建 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)
# 自定義信號處理函數(shù)
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 讀取環(huán)境變量
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):
"""將文本內(nèi)容追加到程序「展示框」"""
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 方法注冊到 下載 按鈕的點擊事件,并自動調(diào)用 self.set_window_init_data 方法來設置輸入框初始值。
5. 下載
下載日志程序 DownloadLog 定義在 app/downloadlog.py 中,遠程下載文件主要步驟有兩步:- 通過 SSH 登錄遠程服務器
- 通過 FTP 進行文件下載
class DownloadLog(object):
def __init__(self, **kwargs):
"""初始化一些參數(shù)"""
...
def main(self):
# 獲取 Transport 實例
tran = paramiko.Transport((self.host, int(self.port)))
# 連接 SSH 服務端
tran.connect(username=self.username, password=self.password)
# 創(chuàng)建 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. 展示下載過程
為了將下載程序執(zhí)行步驟實時展示到輸出框,這里需要引入 PyQt5 的信號處理機制。由于 PyQt 建議只在主線程中操作界面,可以發(fā)現(xiàn)我們在 main.py 中調(diào)用 DownloadLog.main 方法時創(chuàng)建了一個新的線程。所有的 GUI 程序都是事件驅(qū)動的,事件可能由用戶觸發(fā),比如點擊 下載 按鈕事件,也可能由程序觸發(fā),比如我們現(xiàn)在要實現(xiàn)的展示下載過程的功能,就需要使用程序主動觸發(fā)事件。在 PyQt5 中通過 Signal 信號來處理事件,其基本使用步驟如下:自定義一個 CommunicateSignal 類,繼承自 PyQt5 的 QObject 類,里面封裝自定義的 Signal 信號(Signal 實例對象的初始化參數(shù)指定的類型,就是發(fā)出信號對象時,傳遞的參數(shù)數(shù)據(jù)類型。因為 PyQt5 底層是 C++ 開發(fā)的,必須指定類型)。
class CommunicateSignal(QObject):
text_print = pyqtSignal(str)
定義主線程執(zhí)行的函數(shù)處理 Signal 信號(通過 connect 方法綁定)。
# 自定義信號處理函數(shù)
self.comm_signal = CommunicateSignal()
self.comm_signal.text_print.connect(self.show_text)
在 DownloadLog 線程需要操作界面的時候,就通過自定義對象(CommunicateSignal)發(fā)出信號(使用 emit 方法發(fā)出信號),所以在實例化 DownloadLog 時會將 comm_signal 傳遞進去。
# 通過該信號對象的 emit 方法發(fā)出信號,emit 方法的參數(shù)傳遞必要的數(shù)據(jù)。
# 參數(shù)類型遵循定義 Signal 時指定的類型。
self.comm_signal.text_print.emit(text)
主線程信號處理函數(shù),被觸發(fā)執(zhí)行,獲取 Signal 里面的參數(shù),執(zhí)行必要的更新界面操作,這里將每次通過事件傳過來的文本內(nèi)容展示到輸出框內(nèi)。
def show_text(self, text):
"""將文本內(nèi)容追加到程序「展示框」"""
self.textBrowser.append(text)
7. 效果展示
通過以上步驟我們完成的程序設計,現(xiàn)在可以驗證下這個下載日志文件的小程序了:
查看下載結果:
?
?總結
我們通過 PyQt5 實現(xiàn)了一個下載遠程服務器日志文件的小程序,其實它不止可以用來下載日志,同樣可以用來下載其他文件。借助 PyQt5 強大的能力,我們可以通過“拖拉拽”的形式很容易地實現(xiàn)桌面端程序,只需要將原來的 Python 腳本綁定到 UI 程序的事件中,就實現(xiàn)了命令行程序到桌面程序的演進。接下來你可以根據(jù)自己的需求來定制自己的桌面小程序啦~
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
服務器
+關注
關注
14文章
10256瀏覽量
91521 -
GUI
+關注
關注
3文章
697瀏覽量
43486
原文標題:【實操日記】使用PyQt5設計下載遠程服務器日志文件程序
文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
熱點推薦
【服務器數(shù)據(jù)恢復】服務器raid5陣列raid模塊損壞的數(shù)據(jù)恢復案例
某品牌服務器上面有一組由多塊硬盤組建的riad5陣列。意外斷電后管理員重啟服務器發(fā)現(xiàn)該服務器無法使用。
根據(jù)用戶方描述的情況,服務器數(shù)據(jù)恢
服務器遠程連接超時以及拒絕連接的真實緣由和解決辦法
,這類問題在Linux的SSH、Windows的RDP、數(shù)據(jù)庫連接以及API接口訪問中都挺常見。 最常見的情形包含:SSH沒辦法連接服務器、RDP不能遠程登錄Windows、數(shù)據(jù)庫端口訪問超時、內(nèi)網(wǎng)服務從外網(wǎng)無法訪問、
服務器數(shù)據(jù)恢復—意外斷電!Linux服務器數(shù)據(jù)恢復大揭秘
某品牌服務器+存儲,安裝的linux操作系統(tǒng)。
機房意外斷電導致服務器操作系統(tǒng)無法正常啟動,服務器管理員故障服務器進行修復操作后進入系統(tǒng)查看數(shù)據(jù),發(fā)現(xiàn)部分
恒訊科技分析:香港服務器如何遠程桌面連接和管理?
對于選擇香港服務器的企業(yè)和開發(fā)者而言,無論身在何處,穩(wěn)定、安全地遠程連接和管理服務器都是首要任務。恒訊科技將詳細解析如何通過遠程桌面連接(Windows)和SSH(Linux)等主流方
SSH 遠程連接內(nèi)網(wǎng) Linux 服務器
利用 ZeroNews,您可對用內(nèi)網(wǎng)的 Linux 服務器進行統(tǒng)一的 SSH 遠程連接管理,當用戶外出時,可通過 ZeroNews 分配的公網(wǎng)域名地址,快速訪問企業(yè)內(nèi)部、家庭的 Linux
華納云服務器Linux系統(tǒng)日志集中化管理平臺搭建
在云計算時代,企業(yè)運維團隊面臨服務器數(shù)量激增帶來的日志管理難題。本文詳細解析如何基于Linux系統(tǒng)構建高效的云服務器日志集中化管理平臺,涵蓋日志
服務器數(shù)據(jù)恢復—服務器斷電導致raid模塊損壞的數(shù)據(jù)恢復案例
某品牌服務器中有12塊硬盤,組建了一組raid5磁盤陣列,服務器內(nèi)存儲的是普通文件。
機房供電不穩(wěn)定導致服務器斷電,管理員重啟
怎樣在阿里ECS服務器上架設自己的OpenVPN服務器?
需要自己架設服務器,讓現(xiàn)場的IR615路由器連接自己的服務器。能通過自己的服務器進行數(shù)據(jù)采集和遠程運維。
發(fā)表于 08-06 06:56
一文解釋清楚云服務器系統(tǒng)盤怎么清除垃圾
在現(xiàn)代云計算的環(huán)境中,云服務器已經(jīng)成為企業(yè)和個人用戶的主要選擇。在使用云服務器的過程中,用戶往往會面臨系統(tǒng)盤空間不足的問題,這主要是由于各種應用程序、下載文件、
遠程日志errDump調(diào)試功能實戰(zhàn)教程:案例驅(qū)動的故障排查!
及Air8101開發(fā)板實操驗證。 ? 一、errDump功能介紹 1.1 errDump有什么用? errDump是LuatOS系統(tǒng)中的錯誤日志上報模塊,主要用于遠程調(diào)試與故障診斷。 其原理是將模塊運行過程中產(chǎn)生的錯誤信息或者應用日志
手機APP遠程控制,智能家居監(jiān)測、智能控制系統(tǒng)(STM32L4、服務器、安卓源碼)實例項目打包下載
手機APP遠程控制,智能家居監(jiān)測、智能控制系統(tǒng)(STM32L4、服務器、安卓源碼)實例項目打包,推薦下載!
發(fā)表于 05-29 21:47
服務器數(shù)據(jù)恢復—Linux系統(tǒng)服務器崩潰的數(shù)據(jù)恢復案例
服務器數(shù)據(jù)恢復環(huán)境:
linux操作系統(tǒng)服務器中有一組由4塊SAS接口硬盤組建的raid5陣列。
服務器故障:
服務器工作過程中突
服務器數(shù)據(jù)恢復—服務器重裝系統(tǒng)導致分區(qū)消失的數(shù)據(jù)恢復案例
服務器上有一組由raid卡組建的raid5磁盤陣列。上層安裝linux才做系統(tǒng),采用XFS文件系統(tǒng),劃分了3個分區(qū)。
管理員將服務器的操作系統(tǒng)重裝后,發(fā)現(xiàn)
基于RV1126開發(fā)板限制系統(tǒng)日志大小教程
無論管理什么系統(tǒng),對日志文件的監(jiān)控、調(diào)用、管理都是其中重要的一部分。服務器問題的解決都是從查看系統(tǒng)(錯誤)日志開始的。系統(tǒng)日志是記錄系統(tǒng)硬件
服務器數(shù)據(jù)恢復—如何預防服務器故障與恢復服務器數(shù)據(jù)!
服務器常見故障:
硬件故障:磁盤損壞、電池故障等。
軟件問題:操作系統(tǒng)崩潰、未知的程序運行錯誤等。
病毒破壞:勒索病毒加密、刪除服務器數(shù)據(jù)等。
不可控力量;服務器浸水、火燒、機
使用PyQt5設計下載遠程服務器日志文件程序
評論