web-dev-qa-db-ja.com

PyQtウィジェットのconnect()およびdisconnect()

状況に応じて、ボタンを別の機能に接続/再接続したいと思います。

ボタンがあるとしましょう:

myButton = QtGui.QPushButton()

この例では、インターネット接続があるかどうかを確認するとします。

if connected == True:
    myButton.clicked.connect(function_A)

Elif connected == False:
    myButton.clicked.connect(function_B)

最初に、ボタンが別の関数(function_Aまたはfunction_B)に再割り当て/再接続される前に、すでに接続されていた機能からボタンを切断したいと思います。第二に、ボタンが再接続された後、ボタンが新しい機能を取得するために余分なクリックが必要になることにすでに気づきました。ボタンが別の機能に再接続された後も、以前の機能(ボタンが以前に接続された機能(再接続前))を実行しようとします。アドバイスを下さい。前もって感謝します!

編集後:

ウィジェットの。disconnect()メソッドを使用して、ボタンが接続されている機能からボタンを切断できます。

myButton.disconnect()

残念ながら、ウィジェットが関数に接続されていない場合、.disconnect()はエラーをスローします。それを回避するには、Try/Exceptを使用しています。しかし、私はむしろよりエレガントなソリューションを使用したい...

try: myButton.clicked.disconnect() 
except Exception: pass
19
alphanumeric

多くの場所で信号を再接続する必要がある場合は、次のような汎用ユーティリティ関数を定義できます。

def reconnect(signal, newhandler=None, oldhandler=None):
    while True:
        try:
            if oldhandler is not None:
                signal.disconnect(oldhandler)
            else:
                signal.disconnect()
        except TypeError:
            break
    if newhandler is not None:
        signal.connect(newhandler)

...

if connected:
    reconnect(myButton.clicked, function_A)
else:
    reconnect(myButton.clicked, function_B)

(注意:ループは特定のハンドラーを安全に切断するために必要です。ループが複数回接続された可能性があり、disconnectは一度に1つの接続しか削除しないためです。).

20
ekhumoro

これを試して:

from PyQt4 import QtGui as gui

app = gui.QApplication([])

myButton = gui.QPushButton()

def function_A():
    myButton.clicked.disconnect() #this disconnect all!
    myButton.clicked.connect(function_B)
    print 'function_A'

def function_B():
    myButton.clicked.disconnect(function_B) #this disconnect function_B
    myButton.clicked.connect(function_A)
    print 'function_B'

myButton.clicked.connect(function_A)
myButton.setText("Click me!")
myButton.show()

app.exec_()
6
Alvaro Fuentes