プッシュボタンをすぐに無効にするにはどうすればいいですか? 質問する

プッシュボタンをすぐに無効にするにはどうすればいいですか? 質問する


みなさんこんにちは!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 はsleepUI を完全にフリーズするため、.setEnabledメソッドを更新できません。

Qt では、すべてのイベントは UI のメイン スレッド (別のワーカー) で管理されるため、 などのアクションは.setEnabledUI にすぐには影響しません (再描画に少し時間がかかります)。UItime.sleepスレッドを使用するとフリーズするため、Qt のメイン ワーカーはタイマーが終了するまで UI を更新 (再描画) しません。

これを変更するには、PyQt5.QtCore.QTimer を使用します。

def sleep5sec(self):
    self.targetBtn.setEnabled(False)
    QTimer.singleShot(5000, lambda: self.targetBtn.setDisabled(False))

上記の例では即座に無効にするtargetBtnと、5 秒後に再び有効になります。

おすすめ記事