将HTML添加到.setText()会使脚本崩溃

时间:2015-01-31 13:06:19

标签: python multithreading pyqt pyqt4

我有一个显示QLabels的简单程序,并使用其他地方检索的数据更新它们。到目前为止,我使用纯文本进行更新,但希望to use HTML

具体而言,以下行(脱离上下文)更新QLabel

self.root.calendar_today.setText(r['calendar']['today'])

有一些文字。它工作正常。

我刚用

替换了那一行
curcal = "<hr>{today}<hr>".format(
                    today=r['calendar']['today']
                )
self.root.calendar_today.setText(curcal)

现在程序崩溃了

enter image description here

在stderr上有以下内容:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QLabel(0x2f4ed98), parent's thread is QThread(0x2adc7a8), current thread is QThread(0x2f3b418)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x2fb5ea0), parent's thread is QThread(0x2f3b418), current thread is QThread(0x2adc7a8)

我不知道为什么添加一些HTML会触发有关正在创建的线程的一些消息?

使用HTML而不是标签中的纯文本时,我应该注意什么?

编辑:我通过用self.root.calendar_today.setText("<b>hello</b>")替换工作线进一步简化了示例(仍在崩溃)

编辑2 :关注Martijn的评论后,我尝试将QLabel替换为QTextEdit小部件 - 同样的问题({{1 }})


的原因

我间接找出问题的原因(我在ekhumoro的评论弹出时开始转换代码)。

我正在使用QObject: Cannot create children for a parent that is in a different thread. (Parent is QTextDocument(0x33c2220), parent's thread is QThread(0x2f06f00), current thread is QThread(0x33dc770),期望我可以在其中设置小部件属性。事实证明I was wrong并且我不应该这样做,而是使用信号。该代码适用于纯文本但崩溃为HTML,我猜这是多线程中的一个谜。

我重写了我的代码以使用一些信号并且QThreads已正确更新,使用之前崩溃的相同代码。

我想知道是否要删除这个问题,但我会留在这里以防有人目击相同的行为。

1 个答案:

答案 0 :(得分:0)

错误消息表明您以不安全的方式使用多个线程。你永远不应该尝试直接从主线程外部更新gui元素。

在线程之间安全通信的最简单方法是使用信号。