요약 : "noob oddy's example code"은 근본적으로 결함이있는 접근 방식입니다.
저는 파이썬 전문가는 아니지만 "noob oddy"(백그라운드 스레드 내에서 root.event_generate (...)를 호출하는) 예제 코드는 "근본적으로 결함이있는 접근"인 것처럼 보입니다. 즉, "GUI 스레드"(일반적으로 주 스레드)의 컨텍스트 외부에서 Tkinter 함수/개체 메서드를 호출하지 말라는 인터넷상의 여러 기사가 있습니다. 그의 예는 "대부분의 경우"작동하지만 이벤트 생성 속도를 높이면 예제의 "충돌 속도"가 증가하지만 특정 동작은 이벤트 생성 속도와 플랫폼의 성능 특성에 따라 다릅니다.
time.sleep(1)
에 :
time.sleep(0.01)
는 스크립트/응용 프로그램은 보통의 'x'를 지나면 충돌합니다 변경하면, 파이썬 2.7.3와 함께 자신의 코드를 사용하여 예를 들어
, 반복.
"Tkinter를 사용해야 만하는 경우"백그라운드 스레드에서 GUI 스레드로 정보를 가져 오는 가장 "불완전한 방법"이 'after()'위젯 메소드를 사용하여 스레드 안전 객체 (예 : 'Queue'). 예
################################################################################
import threading
import time
import Queue
import Tkinter as Tk
import Tkconstants as TkConst
from ScrolledText import ScrolledText
from tkFont import Font
global top
global dataQ
global scrText
def thread_proc():
x = -1
dataQ.put(x)
x = 0
for i in xrange(5):
for j in xrange(20):
dataQ.put(x)
time.sleep(0.1)
x += 1
time.sleep(0.5)
dataQ.put(x)
def on_after_elapsed():
while True:
try:
v = dataQ.get(timeout=0.1)
except:
break
scrText.insert(TkConst.END, "value=%d\n" % v)
scrText.see(TkConst.END)
scrText.update()
top.after(100, on_after_elapsed)
top = Tk.Tk()
dataQ = Queue.Queue(maxsize=0)
f = Font(family='Courier New', size=12)
scrText = ScrolledText(master=top, height=20, width=120, font=f)
scrText.pack(fill=TkConst.BOTH, side=TkConst.LEFT, padx=15, pady=15, expand=True)
th = threading.Thread(target=thread_proc)
th.start()
top.after(100, on_after_elapsed)
top.mainloop()
th.join()
## end of file #################################################################
분명히 GUI에서 가상 이벤트를 발생시키는 백그라운드 스레드의 event_generate를 사용할 수 있습니다. 대기열 상태에 대한 일종의 알림으로 사용될 수 있습니다. http://groups.google.com/group/comp.lang.python/browse_thread/thread/3476fd30bec12367/853bb6f6dd216960?lnk=gst&q=brunel+%2Bevent_generate#853bb6f6dd216960 –
작동하고있는 것으로 보입니다. 진정한 답변으로 추가하십시오. – Debilski