3

为了学生使用相对简单的 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 解决这个问题?

4

1 回答 1

0

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

于 2013-09-27T10:54:31.370 回答