python 3上的tkinter错误(RuntimeError:从不同的appartment调用Tcl)

时间:2017-10-30 05:08:30

标签: python-3.x tkinter tcl python-multithreading

以下代码在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()

1 个答案:

答案 0 :(得分:3)

必须只从一个线程访问tkinter,特别是主线程(除非你真的非常勇敢)。所有其他线程在需要进行GUI更新时需要向主线程发送消息;有很多机制可以在线程之间发送消息。

线程规则就是这样,因为底层库广泛使用特定于线程的数据(为了避免需要类似全局解释器锁的东西)。你真的无法从另一个线程更新GUI;当你试图这样做时,系统肯定会爆炸。