将 Tkinter GUI 卸载到 Mac OS 上的另一个线程会给出挂起窗口



为了学生使用相对简单的 GUI 库来完成他们的作业,我需要将 GUI 卸载到另一个线程(并使用队列在它们之间传输数据以确保线程安全(。但是,我使用的代码在Windows和Linux上运行良好,但在Mac OS X上给出了一个空白的悬挂屏幕(处理实际上仍在继续,但关闭生成的窗口的唯一方法是强制退出它(。

我将库中的问题缩小到几行代码:

import Tkinter
import threading
class MyFactory(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
  def run(self):
    self.mainroot = Tkinter.Tk()
    self.mainroot.mainloop()
MyFactory().start()

调整代码以让 init(( 调用 start(( 也没有效果:

import Tkinter
import threading
class MyFactory(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    self.start()
  def run(self):
    self.mainroot = Tkinter.Tk()
    self.mainroot.mainloop()
MyFactory()

更改窗口创建的位置(调用 Tk(((只会产生线程错误(应该如此(。

使用的环境分别是Mac OS 10.6.8和10.8,Python 2.6.3和2.7.3。一个限制是不使用Python 3.0或更高版本(尽管如果这是修复它的唯一方法,我将有一些工作要做(。

不过,不使用其他线程的简单测试程序确实可以工作。

问题是如何为Mac OS解决此问题?

修复它的唯一方法可能是在主线程中运行 tkinter 代码。Tkinter 不是为处理线程而设计的。