创建一个窗口,直到代码完成执行

时间:2018-04-19 15:53:46

标签: python pyqt pyqt5

编辑:计时器的目的是模拟需要很长时间才能执行的其他代码。想象一下,不是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秒后它会显示'done!'。

用户按下按钮后,我想要一个窗口弹出“请等待”,当这两秒钟结束时(即剩下的代码执行完毕后,它会自动关闭)

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

enter image description here

然而,它会在2秒后正确关闭。

但是,如果我将a.show()更改为a.exec(),那么我会得到以下内容:

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

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

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

$('.panel-title').click(function() {
  var $this = $(this), // this is the title
    $column = $this.closest('.col-md-6'); // this is the full item

  // Find parent with the class that starts with "col-md"
  // Change class to "col-md-3"
  $this.closest('[class^="col-md"]')
    .toggleClass('col-md-6 col-md-12')
    // Find siblings of parent with similar class criteria
    // - if all siblings are the same, you can use ".siblings()"
    // Change class to "col-md-2"
    .siblings('[class^="col-md"]')
    .removeClass('col-md-3')
    .addClass('col-md-6');

  $column.parent().prepend($column) // prepend the column to the parent - moves it to the top

});