gpt4 book ai didi

python - 制作一个在代码执行完成之前显示的窗口

转载 作者:行者123 更新时间:2023-12-01 09:31:34 25 4
gpt4 key购买 nike

编辑:计时器的目的是模拟其他需要很长时间才能执行的代码。想象一下,有一个函数需要很长时间才能执行,而不是 time.sleep(2) 。

我编写了以下测试代码:

from PyQt5.QtWidgets import (QPushButton, QApplication, QMainWindow, QDialog,
QVBoxLayout, QLabel)
import sys
import time

class MyWarnings(QDialog):
''' Generic popup window with text.'''

def __init__(self):
super(MyWarnings, self).__init__()
widget = QLabel('wait')
layout = QVBoxLayout()
layout.addWidget(widget)
self.setLayout(layout)

class Window(QMainWindow):

def __init__(self):

QMainWindow.__init__(self)
self.widget = QPushButton('push me')
self.widget.pressed.connect(self.push_me)
self.setCentralWidget(self.widget)

def push_me(self):
a = MyWarnings()
a.show()
time.sleep(2)

self.widget.setText('done!')

app = QApplication(sys.argv)
window = Window()
window.show()
app.exec_()

有一个按钮(“推我”),如果用户按下它,那么 2 秒后它会显示“完成!”。

用户按下按钮后,我希望弹出一个窗口,显示“请稍候”,该窗口应在两秒结束时(即其余代码执行完毕时)自动关闭

如果我运行上面的代码,那么确实会弹出一个窗口,但上面没有显示任何内容:

enter image description here

但是,它会在 2 秒后正确关闭。

但是,如果我将 a.show() 更改为 a.exec(),则会得到以下结果:

enter image description here

因此它显示了正确的文本,但没有关闭(实际上,中断了文件其余部分的执行)。

如何让窗口在其余代码执行时显示“等待”而不停止?

最佳答案

不应该使用阻塞任务,因为GUI运行在一个事件循环内,允许你检查其他的如鼠标、键盘等,以及重绘,如果不这样做,它将无法执行因此它不会使用新文本重新绘制小部件。

阻塞任务应尽可能用同步任务替代,否则可以在另一个线程中执行并通过信号通知主线程。

import sys

import time
import threading

from PyQt5.QtWidgets import (QPushButton, QApplication, QMainWindow, QDialog, QVBoxLayout, QLabel)
from PyQt5.QtCore import QObject, pyqtSignal

class Helper(QObject):
finished = pyqtSignal()

def some_task(helper):
time.sleep(2)
helper.finished.emit()

class MyWarnings(QDialog):
def __init__(self):
super(MyWarnings, self).__init__()
widget = QLabel('wait')
layout = QVBoxLayout()
layout.addWidget(widget)
self.setLayout(layout)

class Window(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.widget = QPushButton('push me')
self.widget.pressed.connect(self.push_me)
self.setCentralWidget(self.widget)

def push_me(self):
self.a = MyWarnings()
self.a.show()
self.helper = Helper()
self.helper.finished.connect(lambda: self.widget.setText('done!'))
self.helper.finished.connect(self.a.close)
threading.Thread(target=some_task, args=(self.helper, )).start()


app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

关于python - 制作一个在代码执行完成之前显示的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49925332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com