为什么Windows上的Tkinter堆栈溢出?

时间:2012-06-29 16:14:40

标签: python tkinter stack-overflow

这个简短的Python脚本debugwin.py在我的Linux机器上运行良好:

>>> import debugwin
>>> l = []
>>> debuwin.watch(l)
0
>>> l.append(1)

但是,people have told me在Windows上(Python 2.7.3 Windows 7)它有时在你追加后不会更新,有时会出现堆栈溢出:

>>> error in background error handler:
    out of stack space (infinite loop?) while executing "::tcl::Bgerror {out of stack
    space (infinite loop?)} {-code 1 -level 0 -errorcode NONE -errorinfo {out of stack
    space (infinite loop?)Unable to format..."

脚本如何溢出?

1 个答案:

答案 0 :(得分:3)

如果为报告错误而编写的代码存在错误,它可能会溢出。当它试图报告错误时它调用错误报告代码,但它有一个错误,所以它试图调用错误报告代码,...我不是说这是问题,但这至少是一种方法来获得什么你看到了。

我对您链接的debugwin.py代码崩溃并不特别感到惊讶(至少,我编写此代码时该代码的版本)。 Tkinter不是线程安全的,传统的观点是它应该只在应用程序的主线程中运行。看起来代码在子线程中创建了一个tk解释器。因此,即使错误报告代码中没有错误,tcl解释器在子线程中运行的事实使我认为它可能与线程相关。当然,崩溃似乎是随机的这一事实让我相信它与线程有关。

我看到另一件看起来有点可疑的事情。所有小部件都有update方法,该方法调用标准的tk update命令。您有一个继承自Label的小部件,并且您创建了自己的update方法。这可能不会导致任何问题,但这是代码味道。