以下代码在python3.5上不起作用(RuntimeError:从不同的appartment调用Tcl) 但它在python 2.7上运行良好 很难知道问题的原因以及如何解决它。
import tkinter
import threading
class MyTkApp(threading.Thread):
def __init__(self):
self.root=tkinter.Tk()
self.s = tkinter.StringVar()
self.s.set('Foo')
l = tkinter.Label(self.root,textvariable=self.s)
l.pack()
threading.Thread.__init__(self)
def run(self):
self.root.mainloop()
app = MyTkApp()
app.start()
答案 0 :(得分:3)
你必须只从一个线程访问tkinter,特别是主线程(除非你真的非常勇敢)。所有其他线程在需要进行GUI更新时需要向主线程发送消息;有很多机制可以在线程之间发送消息。
线程规则就是这样,因为底层库广泛使用特定于线程的数据(为了避免需要类似全局解释器锁的东西)。你真的无法从另一个线程更新GUI;当你试图这样做时,系统肯定会爆炸。