문제

Tkinter 요소의 이벤트에 메소드를 바인딩 한 후 메소드를 되돌릴 수있는 방법이 있습니까?

>>> root = Tkinter.Tk()
>>> frame = Tkinter.Frame(root, width=100, height=100)
>>> frame.bind('<Button-1>', lambda e: pprint('Click')) # function needed
>>> frame.pack()
>>> bound_event_method = frame.???
도움이 되었습니까?

해결책

TK C API에 대한 관련 호출은 다음과 같습니다. get_getcommandinfo 어느

TCL_CMDINFO 구조에 명령에 대한 정보를 infoptr에 의해 지적

그러나이 기능은 어디에서나 사용되지 않습니다 _tkinter.c Python Trough에서 사용하는 TK의 바인딩 tkinter.py.

따라서 Tkinter에서 바운드 함수를 꺼내는 것은 불가능합니다. 그 기능을 직접 기억해야합니다.

다른 팁

TCL/TK에서이를 수행하는 표준 방법은 사소합니다. 동일한 바인드 명령을 사용하지만 최종 인수는 없습니다.

bind .b <Button-1> doSomething
puts "the function is [bind .b <Button-1>]"
=> the function is doSomething

Tkinter와 비슷한 일을 할 수 있지만 불행히도 결과는 사용할 수 없습니다.

e1.bind("<Button-1>",doSomething)
e1.bind("<Button-1>")
=> 'if {"[-1208974516doSomething %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y %D]" == "break"} break\n'

분명히, Tkinter는 덮개 아래에서 많은 저글링을하고 있습니다. 한 가지 해결책은이를 기억하는 작은 도우미 절차를 작성하는 것입니다.

def bindWidget(widget,event,func=None):
    '''Set or retrieve the binding for an event on a widget'''

    if not widget.__dict__.has_key("bindings"): widget.bindings=dict()

    if func:
        widget.bind(event,func)
        widget.bindings[event] = func
    else:
        return(widget.bindings.setdefault(event,None))

당신은 다음과 같이 사용할 것입니다.

e1=Entry()
print "before, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")
bindWidget(e1,"<Button-1>",doSomething)
print " after, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")

위의 코드를 실행하면 다음과 같습니다.

before, binding for <Button-1>: None
 after, binding for <Button-1>: <function doSomething at 0xb7f2e79c>

마지막 경고로서, 나는 Tkinter를 많이 사용하지 않으므로 위젯 인스턴스에 속성을 동적으로 추가하는 파급 효과가 확실하지 않습니다. 무해한 것처럼 보이지만, 그렇지 않다면 항상 바인딩을 추적하기 위해 글로벌 사전을 만들 수 있습니다.

필요하지 않은 것처럼 보이지 않습니다. 왜 필요한 경우, 비 익명 기능을 사용하는 경우 직접 저장하지 않겠습니까?

또한 코드는 다음과 같이 작동하지 않습니다. lambda 함수는 진술이 아닌 표현 만 포함 할 수 있습니다. print No-Go입니다 (이것은 Python 3.0에서 변경됩니다. print() 기능이된다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top