我想在线程中调用my_dialog.exec(),但是当mainwindow(平均主线程)处理事件时,它工作不正常,我想知道如何处理此问题
这是我的测试程序:
import sys
from PyQt5.Qt import *
from threading import Thread
from time import sleep
class Main(QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(500, 500, 500, 200)
self.dialog = QDialog(self)
self.dialog.setGeometry(500, 500, 200, 100)
btn = QPushButton('click', self)
btn.clicked.connect(self.show_dialog)
self.show()
def show_dialog(self):
Thread(target=self.execute).start()
def execute(self):
sleep(2)
# keep moving mainwindow untill dialog have shown
self.dialog.exec_()
app = QApplication(sys.argv)
e = Main()
sys.exit(app.exec_())
当我按下按钮时,它将首先睡眠两秒钟。 没有主窗口的事件是正常的。 但是当我在两个睡眠秒中继续移动主窗口(或其他事件,例如调整大小)时,它们两者都将变得无响应
答案 0 :(得分:1)
否,您不能从其他线程修改GUI,请使用信号。
TL; DR;
我在Qt中有一个黄金法则:您不能也不应从另一个线程修改GUI。有关更多信息,请阅读:GUI Thread and Worker Thread。
考虑到上述情况,在Qt中位于不同线程中的元素之间进行交互的自然方法是使用信号,因为它们是thread-safe,如下所示:
click_yes = events.groupby("id")["click"].count(True).reset_index()