python在pyqt5+logging+threading模塊實(shí)時(shí)顯示日志代碼示例
簡(jiǎn)介
在寫(xiě)小工具時(shí),使用pyqt5生成界面,在代碼中使用logging模塊來(lái)打印信息,現(xiàn)在希望能將logging打印的信息實(shí)時(shí)展示在界面上,避免主程序運(yùn)行時(shí)整個(gè)界面卡住的狀態(tài)。
代碼實(shí)現(xiàn)
通過(guò)兩py文件來(lái)實(shí)現(xiàn):
- logging_handler.py 在代碼中,我們使用logging模塊來(lái)記錄日志,不僅可以方便的自定義日志格式,還能隨時(shí)在希望的地方插入日志。
- main.py 使用pyqt5實(shí)現(xiàn)頁(yè)面,配置控件,并通過(guò)threading模塊實(shí)現(xiàn)子線(xiàn)程實(shí)時(shí)打印日志。
logging.Handler重寫(xiě)
我們需要寫(xiě)一個(gè)logging.Handler的子類(lèi),并重寫(xiě)其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.
可以對(duì)指定的日志記錄做任務(wù)事。(寫(xiě)到數(shù)據(jù)庫(kù)、存到本地等都可以)
logging_handler代碼如下:
import logging
from PyQt5.QtWidgets import QTextBrowser
# 設(shè)置全局的日志記錄格式和日志等級(jí)
logging.basicConfig(format="%(asctime)s %(name)s %(levelname)s %(message)s", level=logging.INFO)
class QTextBrowerHandler(logging.Handler):
"""
接收一個(gè)接數(shù)text_browser,他是一個(gè)pyqt5的QTextBrowser控件,特征是不可編輯的文本框,適合用來(lái)記錄日志
"""
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ù)后,寫(xiě)入到QTextBrower控件中"""
msg = self.format(record)
self.text_browser.append(msg)
# 創(chuàng)建一個(gè)logger實(shí)例,其他模塊引用該實(shí)例來(lái)記錄日志
logger = logging.getLogger()
界面創(chuàng)建與日志實(shí)時(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)
# 配置各個(gè)控件,布局頁(yè)面
log_label = QLabel('日志記錄')
log_edit = QTextBrowser()
log_bt = QPushButton('程序啟動(dòng)')
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)建子線(xiàn)程,主線(xiàn)程不阻塞同步執(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í)時(shí)打印

注:如果解釋器執(zhí)行時(shí)發(fā)生異常報(bào)錯(cuò):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í)時(shí)顯示日志的文章就介紹到這了,更多相關(guān)pyqt5 logging threading模塊實(shí)時(shí)顯示日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案
這篇文章主要介紹了pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Scala中使用Jsoup庫(kù)處理HTML文檔的案例分析
Scala是一種多范式的編程語(yǔ)言,具有函數(shù)式編程和面向?qū)ο缶幊痰奶攸c(diǎn),同時(shí)也能夠與Java語(yǔ)言完美兼容,它擁有強(qiáng)大的類(lèi)型推斷、高階函數(shù)、模式匹配等特性,使得代碼更加簡(jiǎn)潔、靈活和易于維護(hù),這篇文章主要介紹了Scala中使用Jsoup庫(kù)處理HTML文檔的案例分析,需要的朋友可以參考下2024-04-04
python中for語(yǔ)句簡(jiǎn)單遍歷數(shù)據(jù)的方法
這篇文章主要介紹了python中for語(yǔ)句簡(jiǎn)單遍歷數(shù)據(jù)的方法,以一個(gè)簡(jiǎn)單實(shí)例形式分析了Python中for語(yǔ)句遍歷數(shù)據(jù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
WIn10+Anaconda環(huán)境下安裝PyTorch(避坑指南)
這篇文章主要介紹了WIn10+Anaconda環(huán)境下安裝PyTorch(避坑指南),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Python實(shí)現(xiàn)的中國(guó)剩余定理算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的中國(guó)剩余定理算法,結(jié)合實(shí)例形式分析了中國(guó)剩余定理的概念、原理及具體算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08
python實(shí)現(xiàn)列表中最大最小值輸出的示例
今天小編就為大家分享一篇python實(shí)現(xiàn)列表中最大最小值輸出的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python連接kafka加載數(shù)據(jù)的項(xiàng)目實(shí)踐
本文主要介紹了python連接kafka加載數(shù)據(jù)的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

