qtextedit更新内容_PyQt5程序在通过日志更新QTextEdit时崩溃

在长时间运行的Python程序中,使用PyQt5的QTextEdit作为日志显示组件,程序在更新日志时可能出现挂起现象。问题可能源于多线程日志记录和GUI更新同步。尝试了QTextEdit、QPlainTextEdit和QListWidget都遇到相同问题。已尝试使用锁来防止多线程冲突,但未解决问题。寻求解决方案。
摘要由CSDN通过智能技术生成

我有一个大程序,需要很长的时间,需要充分的日志记录。我有一个位于前端的GUI,其中包含一个自定义日志处理程序,定义如下:class QHandler(logging.Handler, QTextEdit):

def __init__(self, parent=None):

QTextEdit.__init__(self, parent)

logging.Handler.__init__(self)

self.setLineWrapMode(QTextEdit.NoWrap)

self.setReadOnly(True)

self.emit_lock = Lock()

def emit(self, record):

with self.emit_lock:

self.append(self.format(record))

self.autoScroll()

def format(self, record):

if (record.levelno <= logging.INFO):

bgcolor = WHITE

fgcolor = BLACK

if (record.levelno <= logging.WARNING):

bgcolor = YELLOW

fgcolor = BLACK

if (record.levelno <= logging.ERROR):

bgcolor = ORANGE

fgcolor = BLACK

if (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

def autoScroll(self):

self.verticalScrollBar().setSliderPosition(self.verticalScrollBar().maximum())

我有主gui(QMainWindow),它通过以下方式添加此处理程序:

^{pr2}$

我有一个控制器函数,它通过以下方式初始化日志处理程序:# inside controller initializing function

gui = gui_class() # this is the main gui that initializes the handler among other things

logger = logging.getLogger()

gui.status_handler.setFormatter(file_formatter) # defined elsewhere

logger.addHandler(gui.status_handler)

一旦启动GUI并初始化日志记录,我将使用以下命令完成python执行:app = QApplication.instance()

if (app is None):

app = QApplication([])

app.setStyle('Fusion')

app.exec_()

GUI有几个插槽连接到按钮信号,按钮信号产生线程来进行实际处理。每个处理线程都有它自己的日志记录调用,似乎可以按预期工作。它们的定义如下:class Subprocess_Thread(Thread):

def __init__(self, ):

Thread.__init__(self)

self.logger = logging.getLogger(self.__class__.__name__)

self.logger.info('Subprocess Thread Created')

def run(self):

# does a bunch of stuff

self.logger.info('Running stuff')

# iterates over other objects and calls on them to do stuff

# where they also have a logger attached and called just like above

当我在没有GUI或者最小化GUI的情况下运行我的应用程序时,它每次都运行得很好。我可以在控制台中看到我的日志消息(命令提示符或spyder)。在

如果我在不最小化GUI的情况下运行同一个应用程序,我将在GUI中看到初始化的日志消息和线程化进程的一些最初部分,但随后它将在看似随机的时间挂起。没有错误消息,CPU使用率似乎已达到使用的单个核心的最大值。我添加了一个锁,只是为了确保logging不是从不同的线程传入的,但这也没有帮助。在

我试过去a QPlainTextEdit和QListWidget,但每次都遇到同样的问题。在

有人知道为什么这个GUI元素会导致整个Python解释器在视图中挂起并且消息被记录到其中吗?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值