python在pyqt5+logging+threading模塊實時顯示日志代碼示例
簡介
在寫小工具時,使用pyqt5生成界面,在代碼中使用logging模塊來打印信息,現(xiàn)在希望能將logging打印的信息實時展示在界面上,避免主程序運行時整個界面卡住的狀態(tài)。
代碼實現(xiàn)
通過兩py文件來實現(xiàn):
- logging_handler.py 在代碼中,我們使用logging模塊來記錄日志,不僅可以方便的自定義日志格式,還能隨時在希望的地方插入日志。
- main.py 使用pyqt5實現(xiàn)頁面,配置控件,并通過threading模塊實現(xiàn)子線程實時打印日志。
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實例,其他模塊引用該實例來記錄日志 logger = logging.getLogger()
界面創(chuàng)建與日志實時打印
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控件實例后,再綁定到logger實例上 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
實現(xiàn)效果如下,持續(xù)實時打印
注:如果解釋器執(zhí)行時發(fā)生異常報錯:Process finished with exit code -1073741819 (0xC0000005)
執(zhí)行如下操作:
在File->Settings->Build,Execution,Deployment->Python Debugger中去掉勾選的PyQt compatible點擊確定。
總結(jié)
到此這篇關(guān)于python在pyqt5+logging+threading模塊實時顯示日志的文章就介紹到這了,更多相關(guān)pyqt5 logging threading模塊實時顯示日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案
這篇文章主要介紹了pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06python中for語句簡單遍歷數(shù)據(jù)的方法
這篇文章主要介紹了python中for語句簡單遍歷數(shù)據(jù)的方法,以一個簡單實例形式分析了Python中for語句遍歷數(shù)據(jù)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-05-05WIn10+Anaconda環(huán)境下安裝PyTorch(避坑指南)
這篇文章主要介紹了WIn10+Anaconda環(huán)境下安裝PyTorch(避坑指南),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01python連接kafka加載數(shù)據(jù)的項目實踐
本文主要介紹了python連接kafka加載數(shù)據(jù)的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05