2014-02-05 6 views
12

조건에 따라 버튼을 다른 기능에 연결/다시 연결하고 싶습니다.PyQt 위젯 connect() 및 disconnect()

의 내가 버튼을 있다고 가정 해 봅시다 :이 예를 들어

myButton = QtGui.QPushButton() 

는 이제 인터넷 연결이 있다면 확인 가정 해 봅시다.

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

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

I 버튼 재 할당되기 전에/재접속 다른 함수 (function_A 또는 function_B)에 이미 접속 된 모든 기능에서 버튼을 해제하고자 우선. 둘째, 버튼을 다시 연결 한 후에 버튼을 클릭하면 새 기능을 사용할 수 있다는 사실을 이미 알아 챘습니다. 버튼을 다른 기능에 다시 연결하면 이전 기능 (이전에 재 연결하기 전에 버튼이 연결되었던 기능)을 계속 실행하려고 시도합니다. 제발 조언. 미리 감사드립니다!

는 나중에 편집 :

IT는 위젯의 .disconnect() 메소드 함수가 연결되어 그로부터 버튼을 분리하는데 사용될 수있다 나타난다. 위젯은 임의의 함수에 연결되지 않은 경우

myButton.disconnect() 

불행히도 .disconnect()는 에러가 발생. Try/Except를 사용하고 있습니다. 그러나 나는 오히려 더 우아한 솔루션을 사용하는 것입니다 ...

try: myButton.clicked.disconnect() 
except Exception: pass 
+0

예외는 무엇입니까? 조금 이상하다. 아니, myButton.disconnect()는 myButton.clicked.disconnect()와 다르다. 실제로 어떤 것을 언급하고 있는가? – Schollii

+0

@ Schollii. 'TypeError'를 발생시킵니다. 그리고 예외는 이상한 것이 아닙니다. 사실, 매우 바람직합니다. 이것이 도입 된 이유는 시그널을 연결하고 연결 해제하는 예전 스타일의 방법이 자동으로 실패하기 때문에 잠재적 인 버그를 많이 숨길 수 있기 때문입니다. 간단히 말해서, 훨씬 더 파이썬으로 예외를 발생시킵니다. – ekhumoro

+3

설명해 주셔서 감사합니다. 나는 왜 모든 시그널을 disconnect()하는 함수가 예외적 인 행동으로 "현재 연결이 없다"고 처리해야하는지 알지 못한다. OTOH disconnect (someSignal)를 시도했는데 그 시그널이 존재하지 않는다면, 예외 상태로 표시해야한다는 것을 알 수 있습니다. 그러나 anyhoo, 그것은 여기도 거기에 없다, 정보에게 감사드립니다. – Schollii

답변

13

는, 다음과 같이 일반적인 유틸리티 함수를 정의 할 수 있습니다 :

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) 

(NB : 루프는이를 multple 번 연결되어있을 수 있으므로, 안전하게 특정 핸들러를 분리하기 위해 필요하고, disconnect 만에 하나 명의 접속을 제거한다 ime.).

4

이 시도 : 당신이 많은 장소에서 신호를 다시 연결해야하는 경우

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_() 
+0

위젯이 함수에 연결되어 있는지 확인하는 방법을 알고 있습니까? .isSignalConnected() 위젯 메소드가 있습니다. 불행히도 나는 그것을 사용하는 방법을 모르겠다 ... – alphanumeric

+0

글쎄, 당신은 [이] (http://qt-project.org/forums/viewthread/6820)을 읽어야한다, 나는 희망이 없다고 생각하지만 실제로 나에게 알려주는 길을 찾았다;) –