2012-06-13 6 views
0

두 개의 버튼이 있습니다. 사용자가이를 클릭하고 FileDiagloag를 열어 파일을 선택합니다. 사용자가 두 파일을 선택해야하지만 하나의 기능으로 두 버튼 호출을 모두 처리해야합니다.동일한 콜백 함수 두 개의 인수에 두 개의 버튼을 연결하십시오.

QtCore.QObject.connect(self.ui.Button_SelectJoinFiles_1, QtCore.SIGNAL('clicked()'), self.SelectLogFileToJoin(1)) 
QtCore.QObject.connect(self.ui.Button_SelectJoinFiles_2, QtCore.SIGNAL('clicked()'), self.SelectLogFileToJoin(2)) 

그리고 기능은 기본적으로 같은 것입니다 : 그래서 내 초기화에 내가 가진

def SelectLogFileToJoin(self, ButtonNum): 
     if(ButtonNum==1): 
     ...... 
     if(ButtonNum==2) 
     ..... 

하지만이 프로그램을 시작할 때 나에게 파일을 제공하여 시작하기 때문에이 작동하지 않습니다 선택 대화 상자.

누군가 콜백 함수에 인수를 전달하는 방법을 알려주시겠습니까?

답변

3

여기서 문제는 함수 자체가 아니라 함수가 반환 한 값을 전달한다는 것입니다. 당신이 원하는 일을하려면 미리 채워진 인수와 함께 새로운 기능을 만들 수 functools.partial()를 사용하는 것이 좋습니다 :

from functools import partial 

... 

QtCore.QObject.connect(..., partial(self.SelectLogFileToJoin, 1)) 
+2

'partial'이 경우에 과잉이다. 클로저 꽤 충분합니다 :)'connect (..., lambda : self.SelectLogFileToJoin (1))' – astynax

+0

@astynax 잔인 함? 람다 (lambda)를 사용하는 것은 부분적인 기능을 수행하도록 바퀴를 다시 만드는 덜 분명한 방법입니다. –

+1

하나의 인수로 함수를 부분적으로 적용하는 것이 좋습니다. :)'partial'은 많은 (키워드) 인수가있는 함수의 부분적인 적용에 좋습니다. 그리고 그것은 람다보다 훨씬 낮은 효율성을 가지고 있습니다. 람다 함수는 콜백을위한 좋은 후보이다. 그리고 내 람다 클로저는 깨끗하게 보입니다 (IMHO). – astynax

관련 문제