Tkinter : 메인 루프에서 이벤트를 호출합니다
-
06-07-2019 - |
문제
어떻게 티킨터를 불러 일으키나요? event
별도의 개체에서?
나는 wxwidgets와 같은 것을 찾고 있습니다 wx.CallAfter
. 예를 들어, 객체를 만들고 그것을 전달하면 Tk
루트 인스턴스, 그런 다음 내 객체에서 해당 루트 창의 메소드를 호출하려고합니다. 내 앱이 잠겨 있습니다.
내가 생각해 낼 수있는 최선은 after
방법을 확인하고 별도의 개체에서 상태를 확인하지만 낭비적인 것 같습니다.
해결책
"별도의 개체에서 Tkinter 이벤트를 어떻게 호출합니까?"라는 구체적인 질문에 답하기 위해 event_generate
명령. 루트 창의 이벤트 대기열에 이벤트를 주입 할 수 있습니다. TK의 강력한 가상 이벤트 메커니즘과 결합하여 편리한 메시지 전달 메커니즘이됩니다.
예를 들어:
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")
주목하십시오 event_generate
전화는 즉시 돌아옵니다. 그것이 당신이 원하는지 아닌지는 확실하지 않습니다. 일반적으로 말하면 이벤트 기반 프로그램이 특정 이벤트에 대한 응답을 기다리는 것을 차단하는 것을 원하지 않습니다. GUI를 얼립니다.
그래도 이것이 당신의 문제를 해결하는지 확실하지 않습니다. 코드를 보지 않고 나는 당신의 실제 문제가 무엇인지 잘 모르겠습니다. 예를 들어, 앱이 잠그지 않고 루트가 전달되는 객체의 생성자에 루트의 액세스 방법을 사용할 수 있습니다. 이것은 당신의 코드에 다른 일이 일어나고 있음을 알려줍니다.
다음은 다른 개체에서 루트 창의 메소드에 성공적으로 액세스하는 예입니다.
from tkinter import *
class myClass:
def __init__(self, root):
print("root background is %s" % root.cget("background"))
root = Tk()
newObj = myClass(root)