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

python在pyqt5+logging+threading模塊實(shí)時顯示日志代碼示例

 更新時間:2024年11月15日 15:14:58   作者:d_thon_life  
這篇文章主要介紹了如何使用Python的PyQt5和logging模塊來實(shí)現(xiàn)日志的實(shí)時打印到界面上,避免主程序運(yùn)行時界面卡住,文章還提到了在執(zhí)行過程中可能遇到的異常及解決方法,需要的朋友可以參考下

簡介

在寫小工具時,使用pyqt5生成界面,在代碼中使用logging模塊來打印信息,現(xiàn)在希望能將logging打印的信息實(shí)時展示在界面上,避免主程序運(yùn)行時整個界面卡住的狀態(tài)。

代碼實(shí)現(xiàn)

通過兩py文件來實(shí)現(xiàn):

  • logging_handler.py 在代碼中,我們使用logging模塊來記錄日志,不僅可以方便的自定義日志格式,還能隨時在希望的地方插入日志。
  • main.py 使用pyqt5實(shí)現(xiàn)頁面,配置控件,并通過threading模塊實(shí)現(xiàn)子線程實(shí)時打印日志。

logging.Handler重寫

我們需要寫一個logging.Handler的子類,并重寫其emit的方法,emit方法的官方介紹如下:

emit(record)
Do whatever it takes to actually log the specified logging record. This version is intended to be implemented by subclasses and so raises a NotImplementedError.
可以對指定的日志記錄做任務(wù)事。(寫到數(shù)據(jù)庫、存到本地等都可以)

logging_handler代碼如下:

import logging
from PyQt5.QtWidgets import QTextBrowser

# 設(shè)置全局的日志記錄格式和日志等級
logging.basicConfig(format="%(asctime)s %(name)s %(levelname)s %(message)s", level=logging.INFO)


class QTextBrowerHandler(logging.Handler):
    """
    接收一個接數(shù)text_browser,他是一個pyqt5的QTextBrowser控件,特征是不可編輯的文本框,適合用來記錄日志
    """

    def __init__(self, text_browser: QTextBrowser):
        super().__init__()
        self.text_browser = text_browser

        # 給此handler定義日志的格式
        formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
        self.setFormatter(formatter)

    def emit(self, record):
        """日志處理函數(shù),格式化日志數(shù)據(jù)后,寫入到QTextBrower控件中"""
        msg = self.format(record)
        self.text_browser.append(msg)

# 創(chuàng)建一個logger實(shí)例,其他模塊引用該實(shí)例來記錄日志
logger = logging.getLogger()

界面創(chuàng)建與日志實(shí)時打印

main.py代碼如下

from PyQt5.QtWidgets import QWidget, QTextBrowser, QFrame, QGridLayout, QLabel, QPushButton, QApplication
import time, sys
from logging_handler import logger, QTextBrowerHandler
import threading

class MyTest(QWidget):

    def __init__(self):
        super(MyTest, self).__init__()
        self.initUI()
        self.setWindowTitle('devops_it')
        self.setGeometry(300, 100, 800, 800)
        self.show()

    def initUI(self):
        self.page_frame = QFrame(self)
        self.grid = grid = QGridLayout(self.page_frame)
        self.setLayout(grid)

        # 配置各個控件,布局頁面
        log_label = QLabel('日志記錄')
        log_edit = QTextBrowser()
        log_bt = QPushButton('程序啟動')
        log_bt.clicked.connect(self.log_print)

        # 將自定義的handler綁定QTextBrowser控件實(shí)例后,再綁定到logger實(shí)例上
        handler = QTextBrowerHandler(log_edit)
        logger.addHandler(handler)

        grid.addWidget(log_label, 0, 0)
        grid.addWidget(log_bt, 0, 1)
        grid.addWidget(log_edit, 1, 0)

    def log_print(self):
        """按鈕觸發(fā)的函數(shù)"""
        def func():
            for i in range(10):
                logger.info('我正在打印日志%s'%i)
                logger.info('我等待一秒')
                time.sleep(1)

        # 創(chuàng)建子線程,主線程不阻塞同步執(zhí)行指定函數(shù)
        added_thread = threading.Thread(target=func)
        added_thread.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyTest()
    sys.exit(app.exec_())

執(zhí)行main.py

實(shí)現(xiàn)效果如下,持續(xù)實(shí)時打印

注:如果解釋器執(zhí)行時發(fā)生異常報錯:Process finished with exit code -1073741819 (0xC0000005)

執(zhí)行如下操作:

在File->Settings->Build,Execution,Deployment->Python Debugger中去掉勾選的PyQt compatible點(diǎn)擊確定。

總結(jié)

到此這篇關(guān)于python在pyqt5+logging+threading模塊實(shí)時顯示日志的文章就介紹到這了,更多相關(guān)pyqt5 logging threading模塊實(shí)時顯示日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python測試Kafka集群(pykafka)實(shí)例

    Python測試Kafka集群(pykafka)實(shí)例

    今天小編就為大家分享一篇Python測試Kafka集群(pykafka)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python通過get,post方式發(fā)送http請求和接收http響應(yīng)的方法

    python通過get,post方式發(fā)送http請求和接收http響應(yīng)的方法

    這篇文章主要介紹了python通過get,post方式發(fā)送http請求和接收http響應(yīng)的方法,涉及Python使用urllib模塊與urllib2模塊實(shí)現(xiàn)get與post發(fā)送數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 使用Python讀取Excel數(shù)據(jù)在PPT中創(chuàng)建圖表

    使用Python讀取Excel數(shù)據(jù)在PPT中創(chuàng)建圖表

    使用Python從Excel讀取數(shù)據(jù)并在PowerPoint幻燈片中創(chuàng)建圖表不僅能夠極大地簡化圖表創(chuàng)建過程,通過Python這一橋梁,我們可以輕松實(shí)現(xiàn)數(shù)據(jù)自動化處理和圖表生成,本文將演示如何使用Python讀取Excel數(shù)據(jù)在PPT中創(chuàng)建圖表,需要的朋友可以參考下
    2024-08-08
  • python if not in 多條件判斷代碼

    python if not in 多條件判斷代碼

    學(xué)了一段時間python,發(fā)現(xiàn)有時遇到多條件判斷的時候,覺得使用單純的in的話比較麻煩,需要多個條件,今天又遇到一個,網(wǎng)上搜索了一下,也有同學(xué)和我遇到相同的問題,記錄一下
    2016-09-09
  • NumPy中的維度Axis詳解

    NumPy中的維度Axis詳解

    今天小編就為大家分享一篇NumPy中的維度Axis詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 淺談python中常用的excel模塊庫

    淺談python中常用的excel模塊庫

    本文主要介紹了python中常用的excel模塊庫,感興趣的同學(xué),可以參考下。
    2021-06-06
  • python 從遠(yuǎn)程服務(wù)器下載東西的代碼

    python 從遠(yuǎn)程服務(wù)器下載東西的代碼

    python實(shí)現(xiàn)從遠(yuǎn)程服務(wù)器下載東西的代碼,有需要的朋友可以參考下
    2013-02-02
  • 淺談Python中的zip()與*zip()函數(shù)詳解

    淺談Python中的zip()與*zip()函數(shù)詳解

    這篇文章主要介紹了淺談Python中的zip()與*zip()函數(shù)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • pycharm修改內(nèi)存后無法啟動的解決

    pycharm修改內(nèi)存后無法啟動的解決

    本文介紹了修改PyCharm配置文件以調(diào)整JVM虛擬機(jī)內(nèi)存參數(shù)的方法,包括修改pycharm64.exe.vmoptions和pycharm.vmoptions文件,以及調(diào)整系統(tǒng)環(huán)境變量等內(nèi)容
    2026-04-04
  • python merge、concat合并數(shù)據(jù)集的實(shí)例講解

    python merge、concat合并數(shù)據(jù)集的實(shí)例講解

    下面小編就為大家分享一篇python merge、concat合并數(shù)據(jù)集的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04

最新評論

西昌市| 土默特左旗| 烟台市| 甘肃省| 夏津县| 万盛区| 车险| 都江堰市| 韩城市| 新竹县| 崇信县| 台江县| 西吉县| 柳江县| 瑞安市| 海盐县| 青铜峡市| 达孜县| 社旗县| 米脂县| 绥阳县| 美姑县| 连城县| 伊吾县| 嘉荫县| 五莲县| 磐石市| 泉州市| 瑞丽市| 东乌珠穆沁旗| 墨玉县| 汾西县| 榆社县| 肇源县| 永泰县| 太康县| 枣阳市| 潍坊市| 田东县| 汉寿县| 临沂市|