【问题标题】:pyqt main window keeps crashing after receiving data from a thread从线程接收数据后pyqt主窗口不断崩溃
【发布时间】:2012-01-02 11:21:28
【问题描述】:

我有一个 QMainWindow,它启动一个 QThread 并等待来自网络的数据。收到任何数据时更新 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) 也可以正常工作(当您从它的类中调用它时)。

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

【问题讨论】:

    标签: python pyqt qthread


    【解决方案1】:

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

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

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

    【讨论】:

    • 现在工作正常。你说的对 。我不应该使用 self.parent() ,信号是关键,干得好!
    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 2013-12-09
    • 2023-03-22
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多