2013-03-09 13 views
4

클래스에서 함수 내에서 Tkinter Canvas를 만듭니다. 이 함수는 다른 클래스에 의해 호출되고 있습니다. Tkinter 창이 30 초 동안 팝업되고 나서 닫히고 싶습니다. 나는특정 시간이 지나면 자동으로 창을 닫습니다.

master.mainloop() 
time.sleep(30) 
master.destroy() 

를 호출해야하지만

"elf.tk.call('destroy', self._w) _tkinter.TclError: can't invoke "destroy" command: application has been destroyed"

그래서 어떻게 그 자체를 닫을 수 있습니다 오류를 얻을?

+1

이런 문제에 대해 이해하고 이해하지 못하게하십시오. (미안하지만 추천 할 사람은 없지만 다른 사람이 사용하는 경우도 있습니다.) 네트워크 응용 프로그램뿐만 아니라 네트워크 서버 및 기타 여러 종류의 프로그램도 이벤트 루프를 중심으로 구성되므로 주목해야 할 중요한 내용입니다 장난감 시스템을 넘어선 프로그래밍에서. – abarnert

답변

12

tkinter와 함께 time.sleep()을 사용하지 마십시오. 대신 닫으려는 위젯에서 after 함수를 호출하십시오.

여기

은 가장 간단한 예입니다 : 당신이 것을 얻을 때까지, 당신을 계속 실행 위하여려고하고 있기 때문에, 그것은 이벤트 루프와 GUI를 실행하는 것이 무엇을 의미하는지에 대한 튜토리얼의 어떤 필요

import tkinter as tk 

w = tk.Tk() 
w.after(30000, lambda: w.destroy()) # Destroy the widget after 30 seconds 
w.mainloop() 
+0

tk와 tk.Tk()의 ​​중요성은 무엇인가? – EasilyBaffled

+0

@EasilyBaffled 예, ['import as'] (http://www.python.org/dev/peps/pep-0221/)는 이름 충돌을 피하고 이름 모듈을 더 짧게 만드는 데 사용됩니다. 나는 이것을 Tkinter에서 매우 쓸모 없지만,이 예제에서는'Tkinter import Tk'에서'w = Tk()'를 사용하는 것도 유효합니다. –

+0

@EasilyBaffled :'import Tkinter as tk'의 또 다른 이유는 모듈을 참조하는 다른 모든 장소를 변경하지 않고 첫 번째 행을'tk로 import tinter'로 변경하여 코드를 3.x로 포팅 할 수 있기 때문입니다. – abarnert

4

여기서 문제는 GUI가 종료 될 때까지 mainloop()이 반환되지 않는다는 것입니다.

이후 GUI가 종료되었다가 파괴 된 경우이를 파괴하려고 시도합니다. 그리고 분명히 실패합니다.

sleepdestroy을 메인 루프 내부로 이동시킬 수는 없습니다. 메인 루프 중간에 sleep이 있으면 GUI가 정지됩니다.

그래서 주 루프를 멈추지 않는 일종의 타이머가 필요합니다. tkinter은 정확하게 그 목적을 위해 after 방법을 포함합니다. This answer에는이를 사용하는 자세한 예제가 나와 있습니다.

관련 문제