2011-09-21 10 views
1

나는 내가 root = Tk() 창에 정의 된 초기화 파일을 가질 수 있도록, 좀 더 코드 (기본적으로 Text 위젯과 다른 몇 가지를 포함), 이미 큰 Tkinter 프로그램을 가지고 있고, mainloop() 함수를 호출 마지막 . 내가mainloop 전에 절차 를 호출하는 데 필요한, 그리고이 과정의 끝에 파괴하기 시작에서 wait 창을 인상하고 싶어 할 때까지Tkinter : 하나 이상의 메인 루프?

모든 것이 작동합니다. mainloop() 이후,

msg = Message(root, text='wait a few seconds...') 
msg.pack() 

그러나 그것이 작동하지 수 없습니다 아직 호출되지 않은 :

내가 좋아하는 뭔가를 썼다!

내가 대신 할 경우 :

msg = Message(root, text='wait a few seconds...') 
msg.pack() 
mainloop() 

프로그램은이 첫 번째 mainloop에서 중지, 프로 시저 호출을 완료되지 않습니다.

mainloop()

여기

등의 Tkinter 프로그램이 사용자가 클릭 및 상호 작용에 의해 구동되는 로직에 의해 작동 후 마지막 프로그램 라인, 표기, 나는> 물건을>인상 윈도우의 시퀀스를 필요 destroy window> mainloop

답변

1

프로그램을 초기화 한 후에 mainloop을 한 번 호출해야한다는 것이 맞습니다. 이는 이벤트 루프를 시작하는 데 필요합니다. 이는 자신을 그리거나 이벤트에 응답하는 등의 작업을 수행하는 데 필요합니다.

초기화 작업을 두 부분으로 나누면됩니다. 첫 번째 - 대기 창 만들기 - 이벤트 루프를 시작하기 전에 발생합니다. 나머지 두 번째 작업은 이벤트 루프가 시작되면 발생합니다. after 방법을 통해 두 번째 단계를 예약하여이 작업을 수행 할 수 있습니다. 나는이 문서를 참조하십시오 ... http://infohost.nmt.edu/ 나는 당신에게로

import Tkinter as tk 
import time 

class SampleApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 

     # initialize Tkinter 
     tk.Tk.__init__(self, *args, **kwargs) 

     # hide main window 
     self.wm_withdraw() 

     # show "please wait..." window 
     self.wait = tk.Toplevel(self) 
     label = tk.Label(self.wait, text="Please wait...") 
     label.pack() 

     # schedule the rest of the initialization to happen 
     # after the event loop has started 
     self.after(100, self.init_phase_2) 

    def init_phase_2(self): 

     # simulate doing something... 
     time.sleep(10) 

     # we're done. Close the wait window, show the main window 
     self.wait.destroy() 
     self.wm_deiconify() 

app = SampleApp() 
app.mainloop() 
0

asyncore의 루프 기능을 실행하려면 Tkinter의 방법을 사용해야하지만 asyncore.loop() 대신 asyncore.poll (0)을 사용해야합니다. x ms마다 asyncore.poll (0) 함수를 호출하면 더 이상 Tkinter의 주 루프에 영향을 미치지 않습니다.

+0

, 나는이 Tkinter의 초보자, 그래서 나는 asyncore에 대해 들어 본 적이 : 여기

은 간단한 예제 tcc/help/pubs/tkinter/dont는 그것을 언급하지만, 나의 최종 자원 (effbot)은 여기에 뭔가를 말하고있다. http://effbot.org/zone/asyncore.htm ... 나는 더 쉬운 것을 선호 할 것이고, 나의 원래 문제는 그렇지 않다. 그런 일을 요구하기에 너무 복잡해 보입니다! – alessandro

+0

어쩌면이 문제에 대한 해결책이 될 수 있습니다 : [나를 클릭하십시오!] (http://stackoverflow.com/questions/459083/how-do-you-run-your-own-code-alongside-tkinters-event-loop) – jermenkoo

관련 문제