我正在尝试创建一个弹出的对话框窗口,运行一个函数,然后在函数完成时自动关闭。在下面的代码中,该函数在弹出对话框之前运行,我无法自动关闭,否则会弹出对话框窗口而不响应单击" x"按钮。
如何在弹出窗口可见后创建弹出窗口,运行函数,然后在函数运行完毕后关闭弹出窗口。
# from PyQt4 import QtGui
# QtWidgets = QtGui
from PyQt5 import QtWidgets, QtCore
import sys, time
app = QtWidgets.QApplication(sys.argv)
def print_every_3_seconds():
print(0)
for i in range(1, 4):
time.sleep(1)
print(i)
class RunFunctionDialog(QtWidgets.QDialog):
def __init__(self, function, parent=None):
super(RunFunctionDialog, self).__init__(parent)
self.layout = QtWidgets.QVBoxLayout(self)
self.textBrowser = QtWidgets.QTextBrowser()
self.textBrowser.setText("Wait 3 seconds")
self.layout.addWidget(self.textBrowser)
self.function = function
def showEvent(self, QShowEvent):
self.function()
# self.close() # dialog freezes in an unresponsive state
def show_dialog():
dialog = RunFunctionDialog(print_every_3_seconds)
dialog.exec_()
widget = QtWidgets.QWidget(None)
button = QtWidgets.QPushButton("Show Dialog", widget)
button.clicked.connect(show_dialog)
widget.show()
app.exec_()
答案 0 :(得分:0)
创建一个工作线程并将您的worker函数放在那里。这将防止主(gui)线程被worker函数阻止。您可以使用QThread类。这样做的好处是可以使用完成的信号,如果工作完成,可以用它来关闭对话框。
首先,您需要通过简单地继承QThread:
来创建WorkerThreadclass WorkerThread(QtCore.QThread):
def run(self):
print_every_3_seconds()
然后在RunFunctionDialog.__init__()
中创建一个Worker类的实例,将finished
信号连接到close
插槽并启动该线程。
class RunFunctionDialog(QtWidgets.QDialog):
def __init__(self, function, parent=None):
super(RunFunctionDialog, self).__init__(parent)
# ...
self.function = function
self.thread = WorkerThread()
self.thread.finished.connect(self.close)
self.thread.start()