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

时间:2013-09-27 09:13:33

标签: python multithreading macos tkinter

为了让学生使用相对简单的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或更高版本(但如果这是解决它的唯一方法,我将有一些工作要做)。

不使用其他线程的简单测试程序可以正常工作。

问题是如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

修复它的唯一方法可能就是在主线程中运行你的tkinter代码。 Tkinter不适用于线程。