Python中的初学者图形程序给出了“堆栈空间不足”错误

时间:2009-09-03 11:49:33

标签: python

我目前正在使用Zelle的Introductory文本学习Python,我正在尝试重新创建一个使用附带文件graphics.py的示例程序。因为我使用的是Python 3.1并且文本是为2.x而编写的,所以我使用的是http://mcsp.wartburg.edu/zelle/python中的GraphicsPy3.py文件,并在我的计算机上将其重命名为graphics.py。

名为futval_graph.py的文件如下:

from graphics import *

def main():
    print("This program plots the growth of a 10-year investment.")

    principal = eval(input("Enter the initial principal: "))
    apr = eval(input("Enter the annualized interest rate: "))

    win = GraphWin("Investment Grown Chart", 320, 420)
    win.setBackground("white")
    Text(Point(20, 230), ' 0.0K').draw(win)
    Text(Point(20, 180), ' 2.5K').draw(win)
    Text(Point(20, 130), ' 5.0K').draw(win)
    Text(Point(20, 80), ' 7.5K').draw(win)
    Text(Point(20, 30), '10.0K').draw(win)

    # Rest of code is here but I've commented it out to isolate the problem.

main()

当我在新的IDLE会话上运行'import futval_graph'时,程序只需运行然后在输入'apr'后挂起而不打开新的图形窗口。当我从命令行运行程序时,我得到以下结果:

  

C:\ Python31> futval_graph.py
  该计划描绘了10年投资的增长情况   在后台错误处理程序中输入初始主体:错误:
  堆栈空间(无限循环?)
      执行时   “:: tcl :: Bgerror {堆栈空间不足(无限循环?)} { - code 1 -level 0 -errorco de NONE -errorinfo {堆栈空间不足(无限循环?)
      执行时......“

特别令人沮丧的是,这一系列命令在进入新的IDLE会话时起作用。然后在所有命令都自行运行后从IDLE运行'import futval_graph'时,futval_graph正常工作。

所以我的问题是:如何从命令行和IDLE中正确运行futval_graph.py?对不起,如果我对问题的解释有点分散。如果有任何进一步的信息有助于澄清,请告诉我。

3 个答案:

答案 0 :(得分:2)

Python 3版本的graphics.py似乎存在问题。

我下载了Python 3版本,将其重命名为graphics.py,然后执行以下操作。

PS C:\Users\jaraco\Desktop> python
Python 3.1.1 (r311:74483, Aug 17 2009, 17:02:12) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from graphics import *
>>> dir()
['BAD_OPTION', 'Circle', 'DEAD_THREAD', 'DEFAULT_CONFIG', 'Entry', 'GraphWin', 'GraphicsError', 'GraphicsObject', 'Image', 'Line', 'OBJ_ALREADY_DRAWN', 'Oval',
'Pixmap', 'Point', 'Polygon', 'Queue', 'Rectangle', 'Text', 'Transform', 'UNSUPPORTED_METHOD', '\_\_builtins\_\_', '\_\_doc\_\_', '\_\_name\_\_', '\_\_package\_\_', 'atexit', 'color_rgb', 'copy', 'os', 'sys', 'test', 'time', 'tk']
>>> 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?)
    while execu..."

正如您所看到的,我得到了同样的错误,我甚至没有在模块中执行任何操作。库本身似乎存在问题,而不是您在代码中所做的事情。

我会向作者报告,正如他所说的那样。

如果我只是导入了图形模块,我确实发现没有收到错误。

>>> import graphics
>>> dir(graphics)

我发现如果我对你的代码执行了这个操作,然后将GraphWin的引用更改为graphics.GraphWin,Text to graphics.Text和Point to graphics.Point,问题似乎就消失了,我可以从命令行。

import graphics

def main():
    print("This program plots the growth of a 10-year investment.")

    principal = eval(input("Enter the initial principal: "))
    apr = eval(input("Enter the annualized interest rate: "))

    win = graphics.GraphWin("Investment Grown Chart", 320, 420)
    win.setBackground("white")
    graphics.Text(graphics.Point(20, 230), ' 0.0K').draw(win)
    graphics.Text(graphics.Point(20, 180), ' 2.5K').draw(win)
    graphics.Text(graphics.Point(20, 130), ' 5.0K').draw(win)
    graphics.Text(graphics.Point(20, 80), ' 7.5K').draw(win)
    graphics.Text(graphics.Point(20, 30), '10.0K').draw(win)

    # Rest of code is here but I've commented it out to isolate the problem.

main()

为什么会这样?它不应该。看来graphics.py模块有一些不正常的副作用。

我怀疑你不会在Python 2.x版本下遇到这些错误。

答案 1 :(得分:1)

当使用非空字符串作为参数调用时,您的代码存在内置input的问题。我怀疑它可能与graphics所做的线程设置有关。

如果你让Tkinter小工具阅读这些输入,可能会解决你的问题。

说实话,当您下载graphicsPy3.py时,它会说:

  

图形库移植到Python 3.x.仍然是实验性的,请报告任何问题。

所以,我想,你最好遵循这个建议。

答案 2 :(得分:0)

经过一些额外的研究后,看来对input()的调用确实会对触发不需要的行为产生一些影响。

我重新编写程序,直到input()调用完成后才导入图形模块。在这种情况下,我无法重现错误,即使从命令行运行,代码似乎也能正常运行。我能够从用户那里获取参数,然后它将开始绘制图形(尽管使用示例代码,在应用程序关闭之前只绘制了很少的参数)。也许这种技术可以解决您的问题。

潜在的问题似乎与tkinter模块在单独的线程中初始化的方式以及线程之间的一些不期望的交互有关。我的猜测是,当从命令行运行时,input()方法会锁定资源或以其他方式触发导致Tk线程进入无限循环的行为。

在互联网上进行一些搜索,我发现其他用户也遇到了同样的错误,但出于其他原因。有些人在没有线程支持的情况下构建tkinter时会得到它,但我不认为这适用于此。