みなさんこんにちは!QPushButton インスタンスで奇妙なものを見つけました。あ、まず、私が使用しているのは..
- ウィンドウズ7
- パイソン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_())
私が望んでいるのは、ユーザーがターゲット ボタンを押すと、ボタンがすぐに無効になることです。しかし、私のコードでは、ターゲット ボタンは sleep(5) 後に無効になります。
私のコードの何が問題なのでしょうか?
私の質問を読んでいただきありがとうございます。助けてください。
ベストアンサー1
で示唆されているように糸コメントと@MichalFにリンクしましたが、Python はsleep
UI を完全にフリーズするため、.setEnabled
メソッドを更新できません。
Qt では、すべてのイベントは UI のメイン スレッド (別のワーカー) で管理されるため、 などのアクションは.setEnabled
UI にすぐには影響しません (再描画に少し時間がかかります)。UItime.sleep
スレッドを使用するとフリーズするため、Qt のメイン ワーカーはタイマーが終了するまで UI を更新 (再描画) しません。
これを変更するには、PyQt5.QtCore.QTimer を使用します。
def sleep5sec(self):
self.targetBtn.setEnabled(False)
QTimer.singleShot(5000, lambda: self.targetBtn.setDisabled(False))
上記の例では即座に無効にするtargetBtn
と、5 秒後に再び有効になります。