Python 无法发送其他线程中对象的已发布事件

Python 无法发送其他线程中对象的已发布事件,python,qt,qt4,pyqt,pyqt4,Python,Qt,Qt4,Pyqt,Pyqt4,当我试图从线程中使用一个QDialog对象时,我得到了这个错误。 以下是我正在使用的代码: import threading import test_qdialog from PyQt4 import QtGui, QtCore class MyThread(threading.Thread): def __init__(self, id, window, mutex): self.id = id self.window = window

当我试图从线程中使用一个QDialog对象时,我得到了这个错误。 以下是我正在使用的代码:

import threading
import test_qdialog
from PyQt4 import QtGui, QtCore


class MyThread(threading.Thread):
    def __init__(self, id, window, mutex):
        self.id = id
        self.window = window
        self.mutex = mutex
        super(MyThread, self).__init__()

    def run(self):
        with self.mutex:
            result = self.window.exec_()
            if result == QtGui.QDialog.Accepted:
                print "Thread %d: %s" % (self.id, self.window.message_input.text())


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)

    mutex = threading.Lock()
    threads = []
    window = test_qdialog.MyDialog()

    for i in range(5):
        thread = MyThread(i, window, mutex)
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()

    sys.exit(app.exec_())

正如我在回答中所写的,如果我做对了,我就不能这样做。但是我该怎么做呢?

您只能在主线程上创建和使用GUI小部件(我知道的每个UI库都是这样)。但是,您可以使用QtCore.QtThread轻松地将信号从线程传递到主线程。例如,参见的答案(即使答案不是OP想要的,也与您的情况相关)。也可能会觉得有用

因此,您不需要从线程创建或访问对话框,而是从线程发出一个信号,并让您的主窗口连接到它,在它接收到信号时创建对话框。Qt负责在线程之间传输数据。会很有魅力的


如果你还没有,一定要仔细看看(如果你有,可能想发布关于你不了解的部分的问题,那里有大量重要信息)

实际上,Qt小部件不是线程安全的。@fasked,并且没有解决方法?没有合法的解决方法。Qt文档明确指出,小部件只能从主线程访问。@DmitryMikhaylov如果有帮助,我已经创建了一个很好的实用程序,允许您在Qt应用程序的主线程中运行任意方法。因此,从一个线程,您可以调用
inmain(widget.setText,my_text)
,例如,它将向主线程发布一个事件并运行指定的方法。如果您感兴趣,请查看。为PySide编写,但移植到PyQt对您来说应该是微不足道的!谢谢,@three_Pinepples,我来试一试。实际上,我在主线程中创建了对话。问题是我试图从其他线程访问它。感谢您提供阅读信息。@DmitryMikhaylov我还建议您阅读以下内容:@DmitryMikhaylov我的意思是创建或使用,同样的问题。我编辑过。