+-

大家好!我在QPushButton实例上发现了一些奇怪的东西.哦,首先,我正在使用..
> Windows 7
> python 3.4
> PyQt5
我的测试代码是……
# coding: utf-8
import sys, time
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.targetBtn = QPushButton('target', self)
self.targetBtn.move(100, 100)
self.targetBtn.clicked.connect(self.sleep5sec)
self.setGeometry(100, 100, 300, 300)
self.show()
def sleep5sec(self):
self.targetBtn.setEnabled(False)
time.sleep(5)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
我想要的是..当用户按下目标按钮时,该按钮立即被禁用.但在我的代码中,目标按钮在睡眠后被禁用(5).
我的代码出了什么问题?
感谢您阅读我的问题!请帮忙!
最佳答案
正如 thread中我在评论和@MichalF中所建议的那样,python的睡眠完全冻结了UI,所以它不会让.setEnabled方法更新.
在Qt中,所有事件都使用UI的主线程(这是另一个工作线程)进行管理,因此像.setEnabled这样的操作在UI中没有立即生效(需要稍微重新绘制它).使用time.sleep UI线程冻结,因此,Qt的主工作者不会更新(重绘)de UI,直到计时器结束.
更改它的方法是使用PyQt5.QtCore.QTimer:
def sleep5sec(self):
self.targetBtn.setEnabled(False)
QTimer.singleShot(5000, lambda: self.targetBtn.setDisabled(False))
上面的例子会立即禁用targetBtn,5秒后它会再次重新启用它.
点击查看更多相关文章
转载注明原文:python – 如何使按钮立即禁用? - 乐贴网