摘要:我不會使用「noob oddy's example code」 - 是一個基本上有缺陷的方法。我不是python大師,但是由「noob oddy」(它在後臺線程中調用root.event_generate(...))提供的示例代碼似乎是「根本上有缺陷的方法」。即在互聯網上有幾篇文章陳述「永遠不會在'GUI線程'(通常是主線程)的上下文之外調用Tkinter函數/對象方法」。 他的例子「大部分時間」都有效,但如果你增加事件發生率,那麼這個例子的「崩潰率」就會增加 - 然而,具體的行爲取決於事件發生率和平臺的性能特徵。
例如,使用其代碼與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 #################################################################
顯然,您可以使用後臺線程中的event_generate在GUI中觸發虛擬事件。也許這可以用作關於隊列狀態的一種通知。 http://groups.google.com/group/comp.lang.python/browse_thread/thread/3476fd30bec12367/853bb6f6dd216960?lnk=gst&q=brunel+%2Bevent_generate#853bb6f6dd216960 –
似乎有效。隨意添加它作爲一個真正的答案。 – Debilski