编辑:计时器的目的是模拟需要很长时间才能执行的其他代码。想象一下,不是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!'。
用户按下按钮后,我想要一个窗口弹出“请等待”,当这两秒钟结束时(即剩下的代码执行完毕后,它会自动关闭)
如果我运行上面的代码,那么确实会弹出一个窗口,但它上面没有显示任何内容:
然而,它会在2秒后正确关闭。但是,如果我将a.show()
更改为a.exec()
,那么我会得到以下内容:
因此它会显示正确的文本,但不会关闭(实际上,会中断文件其余部分的执行)。
如何在执行其余代码时让窗口显示“等待”,而不停止它?
答案 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
});