Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在线程中的Qdialog上调用exec()不会';工作不好_Python_Pyqt_Pyqt5_Python 3.7 - Fatal编程技术网

Python 在线程中的Qdialog上调用exec()不会';工作不好

Python 在线程中的Qdialog上调用exec()不会';工作不好,python,pyqt,pyqt5,python-3.7,Python,Pyqt,Pyqt5,Python 3.7,我想在一个线程中调用我的_dialog.exec(),但是当mainwindow(意思是主线程)处理事件时效果不好,我想知道如何处理这个问题 这是我的测试程序: 导入系统 从PyQt5.Qt导入* 从线程导入线程 从时间上导入睡眠 类主(QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() 自设置几何体(500500200) self.dialog=QDialog(self) self.dialog.setGeometry(500500200100

我想在一个线程中调用我的_dialog.exec(),但是当mainwindow(意思是主线程)处理事件时效果不好,我想知道如何处理这个问题

这是我的测试程序:

导入系统 从PyQt5.Qt导入* 从线程导入线程 从时间上导入睡眠 类主(QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() 自设置几何体(500500200) self.dialog=QDialog(self) self.dialog.setGeometry(500500200100) btn=QPushButton('点击',自行) 点击连接(self.show_对话框) self.show() def显示_对话框(自身): 线程(target=self.execute).start() def执行(自我): 睡眠(2) #继续移动主窗口,直到显示对话框 self.dialog.exec() app=QApplication(sys.argv) e=主() sys.exit(app.exec_()) 当我按下按钮时,它会先休眠两秒钟。 没有主窗口事件时,这是正常的。
但是,当我在两个睡眠秒内不断移动主窗口(或其他事件,如调整大小)时,它们都将变得无响应

否,您无法从其他线程修改GUI,请使用这些信号

TL;博士

我在Qt中有一条黄金法则:您不能也不应该从另一个线程修改GUI。有关更多信息,请阅读:

综上所述,Qt中不同线程中的元素之间交互的自然方式是使用信号,因为它们如下所示:

class Main(QMainWindow):
    customSignal = pyqtSignal()

    def __init__(self):
        # ...

        self.show()
        self.customSignal.connect(self.dialog.exec_)

    def show_dialog(self):
        Thread(target=self.execute).start()

    def execute(self):
        sleep(2)
        # keep moving mainwindow untill dialog have shown
        self.customSignal.emit()
类主(QMainWindow):
customSignal=pyqtSignal()
定义初始化(自):
# ...
self.show()
self.customSignal.connect(self.dialog.exec)
def显示_对话框(自身):
线程(target=self.execute).start()
def执行(自我):
睡眠(2)
#继续移动主窗口,直到显示对话框

self.customSignal.emit()
谢谢你的回答。它可以完美地解决这个问题。但不能解决我的问题。此外,谢谢你的黄金法则,我经常发现一些不寻常的行为,比如在线程中移动小部件,有时没有问题,有时它可以;现在我知道了,用PyQT信号是不行的