【问题标题】:Making a window which is displayed until code finishes executing制作一个窗口,直到代码完成执行
【发布时间】:2018-04-19 15:53:45
【问题描述】:

编辑:计时器的目的是模拟其他需要很长时间才能执行的代码。想象一下,不是 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_()

有一个按钮('push me'),如果用户按下它,2 秒后它会显示“完成!”。

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

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

不过,它确实会在 2 秒后正确关闭。

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

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

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

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    不应使用阻塞任务,因为 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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2018-01-26
      • 2022-10-08
      相关资源
      最近更新 更多