我相信您不应该在其他线程上执行主循环。AFAIK,主循环应在创建窗口小部件的同一线程上执行。
我熟悉的GUI工具包(Tkinter,.NET Windows窗体)就是这种方式:您只能从一个线程 *** 作GUI。
在Linux上,您的代码引发异常:
self.tk.mainloop(n)RuntimeError:从其他位置调用Tcl
以下之一将起作用(没有额外的线程):
if __name__ == '__main__': t = tk.Tk() t.iconbitmap('icon.ico') b = tk.Button(text='test', command=exit) b.grid(row=0) t.mainloop()
带有额外的线程:
def threadmain(): t = tk.Tk() t.iconbitmap('icon.ico') b = tk.Button(text='test', command=exit) b.grid(row=0) t.mainloop()if __name__ == '__main__': thread.start_new_thread(threadmain, ()) while 1: sleep(1)
如果需要从tkinter线程外部与tkinter进行通信,建议您设置一个计时器来检查工作队列。
这是一个例子:
import Tkinter as tkimport threadfrom time import sleepimport Queuerequest_queue = Queue.Queue()result_queue = Queue.Queue()def submit_to_tkinter(callable, *args, **kwargs): request_queue.put((callable, args, kwargs)) return result_queue.get()t = Nonedef threadmain(): global t def timertick(): try: callable, args, kwargs = request_queue.get_nowait() except Queue.Empty: pass else: print "something in queue" retval = callable(*args, **kwargs) result_queue.put(retval) t.after(500, timertick) t = tk.Tk() t.configure(width=640, height=480) b = tk.Button(text='test', name='button', command=exit) b.place(x=0, y=0) timertick() t.mainloop()def foo(): t.title("Hello world")def bar(button_text): t.children["button"].configure(text=button_text)def get_button_text(): return t.children["button"]["text"]if __name__ == '__main__': thread.start_new_thread(threadmain, ()) trigger = 0 while 1: trigger += 1 if trigger == 3: submit_to_tkinter(foo) if trigger == 5: submit_to_tkinter(bar, "changed") if trigger == 7: print submit_to_tkinter(get_button_text) sleep(1)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)