最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用?PyQt5?設計下載遠程服務器日志文件程序的思路

 更新時間:2022年11月11日 14:52:14   作者:又拍云  
這篇文章主要介紹了使用?PyQt5?設計下載遠程服務器日志文件程序,借助 PyQt5 強大的能力,我們可以通過“拖拉拽”的形式很容易地實現(xiàn)桌面端程序,只需要將原來的 Python 腳本綁定到 UI 程序的事件中,就實現(xiàn)了命令行程序到桌面程序的演進,需要的朋友可以參考下

最近通過 PyQt5 設計了一個下載服務器指定日期日志文件的程序,里面有些有意思的技術點,現(xiàn)在做一些分享。

PyQt5 是一套 Python 綁定 Digia Qt5 應用的框架,是最強大的 GUI 庫之一,使用 PyQt5 我們能夠很容易的開發(fā)桌面應用,接下來我們將用它來開發(fā)一個下載服務器日志文件的小程序。

前期準備

軟件

  • QT5
  • Python 模塊PyQt5==5.15.7paramiko==2.9.2
  • PyCharm 添加擴展工具 PyUIC

PyUIC 擴展用于將使用 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 項目,設計程序結(jié)構(gòu)如下:

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 進行文件下載

這里采用 paramiko 來實現(xiàn)遠程下載功能,paramiko 是一個純 Python 庫,它實現(xiàn)了 SSHv2 協(xié)議,提供了 SSH 和 FTP 的能力。

核心代碼如下,讀者可以根據(jù)自己的需求實現(xiàn) DownloadLog:

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)在可以驗證下這個下載日志文件的小程序了:

查看下載結(jié)果:

總結(jié)

我們通過 PyQt5 實現(xiàn)了一個下載遠程服務器日志文件的小程序,其實它不止可以用來下載日志,同樣可以用來下載其他文件。
借助 PyQt5 強大的能力,我們可以通過“拖拉拽”的形式很容易地實現(xiàn)桌面端程序,只需要將原來的 Python 腳本綁定到 UI 程序的事件中,就實現(xiàn)了命令行程序到桌面程序的演進。
接下來你可以根據(jù)自己的需求來定制自己的桌面小程序啦~

資料參考:

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遠程服務器日志文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Keras使用tensorboard顯示訓練過程的實例

    Keras使用tensorboard顯示訓練過程的實例

    今天小編就為大家分享一篇Keras使用tensorboard顯示訓練過程的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python中map和列表推導效率比較實例分析

    Python中map和列表推導效率比較實例分析

    這篇文章主要介紹了Python中map和列表推導效率比較,實例分析了Python中的map與列表的推導效率,需要的朋友可以參考下
    2015-06-06
  • python 解決selenium 中的 .clear()方法失效問題

    python 解決selenium 中的 .clear()方法失效問題

    這篇文章主要介紹了python 解決selenium 中的 .clear()方法失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Saltstack快速入門簡單匯總

    Saltstack快速入門簡單匯總

    saltstack是使用python編寫的開源自動化部署與管理工具,擁有良好的擴展性以及優(yōu)秀的執(zhí)行效率,配置簡單,可以工作在多平臺上,經(jīng)常被描述為 Func加強版+Puppet精簡版
    2016-03-03
  • 使用Python進行Ping測試的操作指南

    使用Python進行Ping測試的操作指南

    在網(wǎng)絡工程中,Ping測試是一種常用的網(wǎng)絡診斷工具,用于檢查網(wǎng)絡連接的可達性和響應時間,隨著Python編程語言的廣泛應用,越來越多的網(wǎng)絡工程師開始使用Python進行自動化網(wǎng)絡測試和管理任務,本篇文章將詳細介紹如何使用Python進行Ping測試,需要的朋友可以參考下
    2024-06-06
  • 在PyCharm中安裝PaddlePaddle的方法

    在PyCharm中安裝PaddlePaddle的方法

    這篇文章主要介紹了在PyCharm中安裝PaddlePaddle的方法,本文給大家介紹的非常想詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Python中的XML庫4Suite Server的介紹

    Python中的XML庫4Suite Server的介紹

    這篇文章主要介紹了Python中的XML庫4Suite Server,來自于IBM官方網(wǎng)站,需要的朋友可以參考下
    2015-04-04
  • pandas?如何將字符串映射為數(shù)字

    pandas?如何將字符串映射為數(shù)字

    這篇文章主要介紹了pandas?如何將字符串映射為數(shù)字,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python實現(xiàn)杰卡德距離以及環(huán)比算法講解

    Python實現(xiàn)杰卡德距離以及環(huán)比算法講解

    這篇文章主要為大家介紹了Python實現(xiàn)杰卡德距離以及環(huán)比算法的示例講解,有需要的朋友可以借鑒參考下
    2022-02-02
  • Python數(shù)據(jù)分析:手把手教你用Pandas生成可視化圖表的教程

    Python數(shù)據(jù)分析:手把手教你用Pandas生成可視化圖表的教程

    今天小編就為大家分享一篇Python數(shù)據(jù)分析:手把手教你用Pandas生成可視化圖表的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論

赞皇县| 宝清县| 垫江县| 焉耆| 平江县| 东方市| 贺兰县| 体育| 乌拉特前旗| 安化县| 光山县| 惠安县| 锡林浩特市| 故城县| 灵台县| 会理县| 古田县| 突泉县| 西畴县| 腾冲县| 绵竹市| 德惠市| 新津县| 高碑店市| 德江县| 曲阜市| 永清县| 罗江县| 杭州市| 南川市| 柏乡县| 玛多县| 郁南县| 宁夏| 民和| 肥东县| 灵山县| 浪卡子县| 平原县| 澄江县| 汾阳市|