2012-06-05 2 views
2

버튼을 누를 때 Tkinter에서 버튼의 레이블에 액세스하려고합니다. 여기에는 대상 버튼을 눌렀을 때 참조가 반환됩니다. 내가 입력 인수에 가지고파이썬 기반 TKinter에서 누른 버튼의 인스턴스를 반환하는 방법

현재이는 lambda 기능 즉

button['command'] = lambda: fun_to_call(arg) 

인스턴스를 반환 할 수있는 방법이 있는가에 command 옵션을 결합하면됩니다? 나는 TKDocs를 점검했는데 커버하지 않았다. 또한 레이블 대신 별도의 문자열 목록을 사용하려고했습니다. 그러나 그것은 단지 목록의 마지막 요소를 반환합니다. (단추 인스턴스를 만들 때 목록에 특정 요소를 바인딩하지 않는 람다 함수 때문이라고 생각합니다.)이 목록을 사용하여 단추 목록을 생성했습니다.

즉, 이벤트 기반 함수는 부모를 반환하는 버튼에 바인딩됩니다 (버튼이 눌려 있음).

선언

답변

3
def add_callback(control, fun): 
    def inner(): 
     return fun(control) 
    control['command'] = inner 

... 

def test_callback(button): 
    print "button instance:", button 

b = Button(text="click me") 
add_callback(b, test_callback) 

더 :

def with_callback(control, fun): 
    def inner(): 
     return fun(control) 
    control['command'] = inner 
    return control 

... 
b = with_callback(Button(text="click me"), test_callback) 
+0

감사합니다! 그건 완벽하게 작동합니다. 아직도 어떻게 작동하는지 이해하려고 노력하고 있습니다. 위의'lambda' 함수가 작동하지 않는 이유는 무엇입니까? 사용하고있는 내부 함수에 대한이 기사를 읽으십시오 : http://stackoverflow.com/questions/1589058/nested-function-in-python – jhtong

+0

@toiletfreak, 간단한 Tkinter 콜백 - 인수없이 함수 ('lambda'). 'with_callback'은 (컨트롤 인스턴스의) [closure] (http://en.wikipedia.org/wiki/Closure_ (computer_science))를 만들고 인자없이 동적으로 생성 된 콜백을 반환합니다 – astynax

관련 문제