简介:我不会使用“ noob oddy的示例代码”
-这是一种根本有缺陷的方法。
我不是python专家,但是“ noob oddy”(在后台线程中调用root.event_generate(…))提供的示例代码似乎是“有根本缺陷的方法”。即,互联网上有几篇文章指出“从不在“
GUI线程”(通常是主线程)的上下文之外调用Tkinter函数/对象方法”。他的示例在大多数情况下都有效,但是,如果增加事件发生率,则示例的“崩溃率”将增加-
但是,特定行为取决于事件发生率和平台的性能特征。
例如,如果您进行更改,则将他的代码与Python 2.7.3结合使用:
time.sleep(1)
至:
time.sleep(0.01)
那么脚本/应用通常会在“ x”次迭代后崩溃。
经过大量搜索后,如果您“必须使用Tkinter”,则看来将“信息从后台线程获取到GUI线程”的最“防弹方法”是使用“
after()”小部件方法来轮询线程安全对象(例如“队列”)。例如,
################################################################################import threadingimport timeimport Queueimport Tkinter as Tkimport Tkconstants as TkConstfrom ScrolledText import ScrolledTextfrom tkFont import Fontglobal topglobal dataQglobal scrTextdef 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=%dn" % 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 #################################################################



