栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通过日志更新QTextEdit时PyQt5程序崩溃

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过日志更新QTextEdit时PyQt5程序崩溃

QHandler
该样本是不是线程安全的,所以如果你从另一个线程调用它,它就会产生问题,因为它是一个GUI,一个可能的解决方案是从辅助线程发送数据(
defemit(self, record):
通过)到GUI的线程
QmetaObject
你为这个必须使用
pyqtSlot

class QHandler(logging.Handler, QtWidgets.QTextEdit):    def __init__(self, parent=None):        QtWidgets.QTextEdit.__init__(self, parent)        logging.Handler.__init__(self)        self.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)        self.setReadonly(True)        self.emit_lock = threading.Lock()    def emit(self, record):        with self.emit_lock: QtCore.QmetaObject.invokeMethod(self,      "append",       QtCore.Qt.QueuedConnection,     QtCore.Q_ARG(str, self.format(record))) QtCore.QmetaObject.invokeMethod(self,      "autoScroll",     QtCore.Qt.QueuedConnection)    def format(self, record):        if record.levelno == logging.INFO: bgcolor = WHITE fgcolor = BLACK        elif record.levelno == logging.WARNING: bgcolor = YELLOW fgcolor = BLACK        elif record.levelno == logging.ERROR: bgcolor = ORANGE fgcolor = BLACK        elif record.levelno == logging.CRITICAL: bgcolor = RED fgcolor = BLACK        else: bgcolor = BLACK fgcolor = WHITE        self.setTextBackgroundColor(bgcolor)        self.setTextColor(fgcolor)        self.setFont(DEFAULT_FONT)        record = logging.Handler.format(self, record)        return record    @QtCore.pyqtSlot()    def autoScroll(self):        self.verticalScrollBar().setSliderPosition(self.verticalScrollBar().maximum())

例:

import randomimport loggingimport threadingfrom PyQt5 import QtCore, QtGui, QtWidgetsWHITE, BLACK, YELLOW, ORANGE, RED = QtGui.QColor("white"), QtGui.QColor("black"), QtGui.QColor("yellow"), QtGui.QColor("orange"), QtGui.QColor("red")DEFAULT_FONT = QtGui.QFont()class QHandler(logging.Handler, QtWidgets.QTextEdit):    def __init__(self, parent=None):        QtWidgets.QTextEdit.__init__(self, parent)        logging.Handler.__init__(self)        self.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)        self.setReadonly(True)        self.emit_lock = threading.Lock()    def emit(self, record):        with self.emit_lock: QtCore.QmetaObject.invokeMethod(self,      "append",       QtCore.Qt.QueuedConnection,     QtCore.Q_ARG(str, self.format(record))) QtCore.QmetaObject.invokeMethod(self,      "autoScroll",     QtCore.Qt.QueuedConnection)    def format(self, record):        if record.levelno == logging.INFO: bgcolor = WHITE fgcolor = BLACK        elif record.levelno == logging.WARNING: bgcolor = YELLOW fgcolor = BLACK        elif record.levelno == logging.ERROR: bgcolor = ORANGE fgcolor = BLACK        elif record.levelno == logging.CRITICAL: bgcolor = RED fgcolor = BLACK        else: bgcolor = BLACK fgcolor = WHITE        self.setTextBackgroundColor(bgcolor)        self.setTextColor(fgcolor)        self.setFont(DEFAULT_FONT)        record = logging.Handler.format(self, record)        return record    @QtCore.pyqtSlot()    def autoScroll(self):        self.verticalScrollBar().setSliderPosition(self.verticalScrollBar().maximum())class MainWindow(QtWidgets.QMainWindow):    def __init__(self, parent=None):        super(MainWindow, self).__init__(parent)        self.status_handler = QHandler()        self.setCentralWidget(self.status_handler)        logging.getLogger().addHandler(self.status_handler)        self.status_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))        logging.getLogger().setLevel(logging.DEBUG)        timer = QtCore.QTimer(self, interval=1000, timeout=self.on_timeout)        timer.start()    def on_timeout(self):        logging.info('From Gui Thread {}'.format(QtCore.QDateTime.currentDateTime().toString()))class Subprocess_Thread(threading.Thread):    def __init__(self):        threading.Thread.__init__(self)        self.logger = logging.getLogger(self.__class__.__name__)        self.logger.info('Subprocess Thread Created')    def run(self):        while True: t = random.choice(["info", "warning", "error", "critical"]) msg = "Type: {}, thread: {}".format(t, threading.currentThread()) getattr(self.logger, t)(msg) QtCore.QThread.sleep(1)if __name__ == '__main__':    import sys    app = QtWidgets.QApplication.instance()    if app is None:        app = QtWidgets.QApplication(sys.argv)        app.setStyle('Fusion')    w = MainWindow()    w.show()    th = Subprocess_Thread()    th.daemon = True    th.start()    sys.exit(app.exec_())


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516929.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号