РЕЗЮМЕ: Я бы не использовал « пример кода noob oddy » - это принципиально ошибочный подход.
Я не гуру Python, но пример кода, предоставленный« noob oddy » (который вызывает root.event_generate (...) в фоновом потоке) представляется «принципиально ошибочным подходом».то есть в Интернете есть несколько статей, в которых говорится, что «никогда не вызывать функции / методы объекта Tkinter вне контекста потока GUI» (который обычно является основным потоком).Его пример работает «большую часть времени», но если вы увеличите частоту генерации событий, то «частота отказов» примера увеличится, однако конкретное поведение зависит от частоты генерации событий и характеристик производительности платформы.
Например, используя его код с Python 2.7.3, если вы измените:
time.sleep(1)
на:
time.sleep(0.01)
, то скрипт / приложение обычно будет аварийно завершать работу после 'x'количество итераций.
После долгих поисков, если вы "должны использовать Tkinter", тогда кажется, что наиболее "пуленепробиваемый метод" получения информации из фонового потока в поток GUI - это использовать "after () 'метод виджета для опроса поточно-ориентированного объекта (например,' Очередь ').например,
################################################################################
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 #################################################################