pyqt主窗口在从线程接收数据后不断崩溃

时间:2011-11-20 18:36:19

标签: python pyqt qthread

我有一个启动QThread的QMainWindow并等待来自网络的数据。在接收任何数据时更新UI。

问题是:它有时会崩溃。有时我不这样做,我启动它并等待数据。

这是线程类:

class ListenerThread(QtCore.QThread):

        def __init__(self,host,port,window):
            super(ListenerThread,self).__init__(window)
            self.host = host
            self.port = port
            self.window = window


        def run(self):

            soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            soc.bind((self.host, self.port))

            while True:

            data, address =  soc.recvfrom(9999)
            print address


            if data:



                dataList = data.split("\\")


                company  = dataList[1] 
                projectName = dataList[2]  
                assets = dataList[3]  
                assetType = dataList[4]  
                assetName = dataList[5] 



          # parent here is the main window(the main thread) : updateCombo is a function that updates combo box inside the               main window 

                self.parent().updateCombo(self.window.comboBoxCompany,company)
                self.parent().updateCombo(self.window.dropDownProjects,projectName)

                self.parent().select(assets,assetName)

为什么会这样?请记住,主窗口本身工作正常。

函数(updateCombo)也正常工作(当你从它的类中调用它时)。

但是当我发送数据时主窗口会一直崩溃!知道为什么吗?

1 个答案:

答案 0 :(得分:3)

GUI小部件只能从主线程访问,这意味着调用QApplication.exec()的线程。从任何其他线程访问GUI小部件 - 您对self.parent()的调用所执行的操作 - 是未定义的行为,在您的情况下,这意味着崩溃。

您可以通过信号和插槽以安全的方式在后台线程和GUI之间进行通信。

请阅读有关Qt线程功能的文档,因为上述内容在处理多线程GUI应用程序时实际上是必不可少的知识,不仅在Qt中,而且在任何其他GUI框架中也是如此。