gpt4 book ai didi

python - 在 pyqt 中显示日志的最佳方式?

转载 作者:太空狗 更新时间:2023-10-29 17:36:50 25 4
gpt4 key购买 nike

我目前正在使用 qt 设计器开发 GUI。我想知道我应该如何在像记录器窗口一样的 GUI 上打印字符串。我正在使用 pyqt5。

最佳答案

改编自Todd Vanyo的 PyQt5 示例:

import sys
from PyQt5 import QtWidgets
import logging

# Uncomment below for terminal log messages
# logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(name)s - %(levelname)s - %(message)s')

class QTextEditLogger(logging.Handler):
def __init__(self, parent):
super().__init__()
self.widget = QtWidgets.QPlainTextEdit(parent)
self.widget.setReadOnly(True)

def emit(self, record):
msg = self.format(record)
self.widget.appendPlainText(msg)


class MyDialog(QtWidgets.QDialog, QtWidgets.QPlainTextEdit):
def __init__(self, parent=None):
super().__init__(parent)

logTextBox = QTextEditLogger(self)
# You can format what is printed to text box
logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logging.getLogger().addHandler(logTextBox)
# You can control the logging level
logging.getLogger().setLevel(logging.DEBUG)

self._button = QtWidgets.QPushButton(self)
self._button.setText('Test Me')

layout = QtWidgets.QVBoxLayout()
# Add the new logging box widget to the layout
layout.addWidget(logTextBox.widget)
layout.addWidget(self._button)
self.setLayout(layout)

# Connect signal to slot
self._button.clicked.connect(self.test)

def test(self):
logging.debug('damn, a bug')
logging.info('something to remember')
logging.warning('that\'s not right')
logging.error('foobar')

app = QtWidgets.QApplication(sys.argv)
dlg = MyDialog()
dlg.show()
dlg.raise_()
sys.exit(app.exec_())

线程问题

注意:截至 2022 年底,这仍然是排名最高的答案。 OP 似乎不再活跃,所以我冒昧地对其进行了编辑,因为缺乏对其用法含义的解释是导致密切相关问题的常见原因。

请注意,以上代码仅适用于单线程 程序。如果你确定你的程序没有使用线程,那也没关系。不过请注意:您必须完全确定这一点,还要考虑外部模块。包括 Qt。

不要小看这方面:甚至一些线程安全的Qt类实际上也不是单线程的;例如,QFileSystemModel 是一个线程安全对象,但它确实使用线程来进行文件系统爬行。如果它出于任何原因(即访问权限)遇到问题,它会从这些线程输出一些调试消息,您可能仍然会遇到问题。

访问 UI 元素时低估线程问题的可能结果包括:

  • 意外行为;
  • 绘制工件;
  • 大量“不相关”的调试消息;
  • 程序可能发生致命崩溃;

因此,根据经验,上述内容必须被视为不安全并且不应使用,因为它甚至试图从外部访问 QPlainTextEdit 小部件线程:小部件不是线程安全的,只能从主线程访问。
由于在不无意义地影响性能的情况下无法立即知道日志记录源是否在同一线程中,因此最好在任何情况下始终使用线程安全解决方案(请参阅考虑这方面的其他答案)。

关于python - 在 pyqt 中显示日志的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28655198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com