1

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

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

但是,人们告诉我,在 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..."

脚本怎么会溢出?

4

1 回答 1

3

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

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

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

于 2012-06-29T17:41:47.083 回答