pyqt如何创建一个等待弹出窗口来运行长函数/ calulation

时间:2017-03-13 18:18:49

标签: python pyqt

我正在尝试创建一个弹出的对话框窗口,运行一个函数,然后在函数完成时自动关闭。在下面的代码中,该函数在弹出对话框之前运行,我无法自动关闭,否则会弹出对话框窗口而不响应单击" 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_()

1 个答案:

答案 0 :(得分:0)

创建一个工作线程并将您的worker函数放在那里。这将防止主(gui)线程被worker函数阻止。您可以使用QThread类。这样做的好处是可以使用完成的信号,如果工作完成,可以用它来关闭对话框。

首先,您需要通过简单地继承QThread:

来创建WorkerThread
class 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()