python pyqt5写一个装饰器用于弹窗等待函数执行完成
时间: 2023-04-09 14:04:04 浏览: 373
好的,我可以回答这个问题。您可以使用QProgressDialog类来创建一个进度对话框,然后将其作为装饰器包装您的函数。以下是一个示例代码:
```python
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QProgressDialog
import time
class WorkerThread(QThread):
finished = pyqtSignal()
def __init__(self, func, *args, **kwargs):
super().__init__()
self.func = func
self.args = args
self.kwargs = kwargs
def run(self):
self.func(*self.args, **self.kwargs)
self.finished.emit()
def wait_dialog(title, message):
def decorator(func):
def wrapper(*args, **kwargs):
app = QApplication.instance()
dialog = QProgressDialog(title, message, 0, 0, parent=app.activeWindow())
dialog.setWindowModality(2)
dialog.show()
thread = WorkerThread(func, *args, **kwargs)
thread.finished.connect(dialog.accept)
thread.start()
dialog.exec_()
return wrapper
return decorator
@wait_dialog("Please wait", "Function is running...")
def my_function():
time.sleep(5)
print("Function is done!")
if __name__ == '__main__':
app = QApplication([])
window = QWidget()
window.show()
my_function()
app.exec_()
```
在这个示例中,我们定义了一个`WorkerThread`类,它继承自`QThread`,并包含一个`finished`信号。我们还定义了一个`wait_dialog`装饰器,它创建了一个进度对话框,并将其作为装饰器包装的函数的父窗口。在装饰器内部,我们创建了一个`WorkerThread`实例,并将其连接到进度对话框的`accept`槽,以便在函数执行完成后关闭对话框。
最后,我们使用`@wait_dialog`装饰器来装饰我们的函数`my_function`,并在主函数中调用它。当我们运行这个程序时,它将显示一个进度对话框,等待函数执行完成,然后关闭对话框并打印出"Function is done!"。
阅读全文