2008-11-06 5 views
14

tkinter event을 별도의 객체에서 어떻게 호출합니까?Tkinter : 메인 루프에서 이벤트 호출

나는 wxWidgets wx.CallAfter과 같은 것을 찾고 있습니다. 예를 들어, 개체를 만들고 내 Tk 루트 인스턴스를 전달한 다음 내 개체에서 해당 루트 창의 메서드를 호출하려고하면 내 응용 프로그램이 잠 깁니다.

가장 좋은 방법은 after 메서드를 사용하고 내 별도 개체에서 상태를 확인하는 것입니다.하지만 이는 낭비적인 것처럼 보입니다.

답변

25

"다른 개체에서 TkInter 이벤트를 어떻게 호출합니까?"라는 질문에 대답하려면 event_generate 명령을 사용하십시오. 루트 윈도우의 이벤트 대기열에 이벤트를 삽입 할 수 있습니다. Tk의 강력한 가상 이벤트 메커니즘과 결합하면 편리한 메시지 전달 메커니즘이됩니다. 예를 들어

다음 event_generate 호출이 즉시 반환됩니다

from tkinter import * 

def doFoo(*args): 
    print("Hello, world") 

root = Tk() 
root.bind("<<Foo>>", doFoo) 

# some time later, inject the "<<Foo>>" virtual event at the 
# tail of the event queue 
root.event_generate("<<Foo>>", when="tail") 

참고. 그것이 당신이 원하는 것인지 아닌지는 분명하지 않습니다. 일반적으로 말하자면, 이벤트 기반 프로그램이 특정 이벤트에 대한 응답 대기를 차단하는 것을 원하지 않습니다. 은 GUI을 고정시킵니다.

이렇게해도 문제가 해결되는지 잘 모르겠습니다. 귀하의 코드를 보지 않고서는 귀하의 실제 문제가 무엇인지 잘 모릅니다. 예를 들어, 응용 프로그램을 잠그지 않고 루트가 전달되는 객체 생성자에서 root의 메서드에 액세스 할 수 있습니다. 이것은 당신의 코드에서 진행중인 다른 것을 알려줍니다.

여기에 성공적으로 다른 객체에서 루트 창에서 방법 접근의 예 :

from tkinter import * 

class myClass: 
    def __init__(self, root): 
     print("root background is %s" % root.cget("background")) 

root = Tk() 
newObj = myClass(root) 
4

을 여기에 그냥 문서 링크 아래에 더 이상 브라이언의 대답을 이해. New Mexico Tech에서

함수 설명 :

w.event_generate(sequence, **kw)

이 방법은 외부 자극없이 트리거 이벤트를 야기한다. 이벤트의 처리는 외부 자극에 의해 트리거 된 경우와 같습니다. sequence 인수는 트리거 될 이벤트를 설명합니다. keyword = value 인수를 제공하여 Event 객체에서 선택된 필드의 값을 설정할 수 있습니다. 여기서 키워드는 Event 객체의 필드 이름을 지정합니다.

목록과 TCL/TK 이벤트의 설명을 here

속성
관련 문제