+-
python – 如何使按钮立即禁用?
大家好!我在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 – 如何使按钮立即禁用? - 乐贴网