<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近通過 PyQt5 設計了一個下載伺服器指定日期紀錄檔檔案的程式,裡面有些有意思的技術點,現在做一些分享。
PyQt5 是一套 Python 繫結 Digia Qt5 應用的框架,是最強大的 GUI 庫之一,使用 PyQt5 我們能夠很容易的開發桌面應用,接下來我們將用它來開發一個下載伺服器紀錄檔檔案的小程式。
軟體
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
建立 DownloadServerLog 專案,設計程式結構如下:
DownloadServerLog ├── app │ ├── downloadlog.py │ └── downloadlog_qtui.py ├── main.py └── ui │ └── downloadlog_qtui.ui ├── .env
main.py 作為程式入口檔案,.env 存放環境變數,ui 存放使用 Qt Designer 設計介面匯出的原始碼檔案,app 存放下載程式檔案。
Qt Designer 使用起來非常簡單,可以通過“拖拉拽”的形式生成 UI 介面(檔案:https://doc.qt.io/qtcreator/creator-using-qt-designer.html),設計介面如下:
這個程式功能一目瞭然,左側幾個輸入框用於輸入必要的資訊,右側一個展示框用於展示程式實時紀錄檔。介面設計好後可以將其儲存至專案 DownloadServerLog 下的 ui 目錄下 downloadlog_qtui.ui,供後續使用。
使用 PyCharm 開啟專案,在 downloadlog_qtui.ui 檔案上右鍵,選擇 External Tools 使用 PyUIC 根據 ui 檔案生成對應的 py 檔案 downloadlog_qtui.py,將檔案存放至 app 目錄。
在專案根目錄下建立 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_())
MyWindow 作為主視窗程式,程式初始化時會將 self.click_download 方法註冊到 下載 按鈕的點選事件,並自動呼叫 self.set_window_init_data 方法來設定輸入框初始值。
下載紀錄檔程式 DownloadLog 定義在 app/downloadlog.py 中,遠端下載檔案主要步驟有兩步:
這裡採用 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 host self.sftp.get(remotepath=self.remote_path, localpath=self.local_path)
為了將下載程式執行步驟實時展示到輸出框,這裡需要引入 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)
通過以上步驟我們完成的程式設計,現在可以驗證下這個下載紀錄檔檔案的小程式了:
檢視下載結果:
我們通過 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 設計下載遠端伺服器紀錄檔檔案程式的文章就介紹到這了,更多相關PyQt5遠端伺服器紀錄檔檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45