簡體   English   中英

pyqt如何創建等待彈出窗口以運行長函數/計算

[英]pyqt how to create a wait popup for running a long function/calulation

我正在嘗試創建一個對話框窗口,該窗口會彈出,運行一個函數,然后在函數完成后自動關閉。 在下面的代碼中,該函數在彈出對話框之前運行,並且我無法自動關閉,否則對話框窗口將彈出並且對單擊“ 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_()

創建一個工作線程並將您的工作程序函數放在其中。 這將防止您的主(gui)線程被輔助函數阻塞。 您可以為此使用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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM