[英]How to create simple PyQt popup in Python function and close at the end of it?
[英]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.