2016-08-26 43 views
0

当我按照Think Python教科书输入以下代码时,我收到下面的错误消息。无法调用“画布”命令:应用程序已被破坏

该窗口实际上显示,但它不包含所需的内容。

from swampy.World import World 
world=World() 
world.mainloop() 
canvas = world.ca(width=500, height=500, background='white') 
bbox = [[-150,-100], [150, 100]] 
canvas.rectangle(bbox, outline='black', width=2, fill='green4') 

错误信息是这样的:

Traceback (most recent call last): 
    File "15.4.py", line 4, in <module> 
    canvas = world.ca(width=500, height=500, background='white') 
    File "/usr/local/lib/python2.7/dist-packages/swampy/Gui.py", line 244, in ca 
    return self.widget(GuiCanvas, width=width, height=height, **options) 
    File "/usr/local/lib/python2.7/dist-packages/swampy/Gui.py", line 359, in widget 
    widget = constructor(self.frame, **widopt) 
    File "/usr/local/lib/python2.7/dist-packages/swampy/Gui.py", line 612, in __init__ 
    Tkinter.Canvas.__init__(self, w, **options) 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2234, in __init__ 
    Widget.__init__(self, master, 'canvas', cnf, kw) 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2094, in __init__ 
    (widgetName, self._w) + extra + self._options(cnf)) 
    _tkinter.TclError: can't invoke "canvas" command: application has been destroyed 

回答

3

主要应用循环必须是几乎你在你的应用程序中运行的最后一件事。所以移动world.mainloop()到代码中这样结尾:

from swampy.World import World 

world = World() 

canvas = world.ca(width=500, height=500, background='white') 
bbox = [[-150, -100], [150, 100]] 
canvas.rectangle(bbox, outline='black', width=2, fill='green4') 

world.mainloop() 

在你的代码会发生什么事是,当与world.mainloop()线被击中,它建立了用户界面元素,并进入到主循环,其不断为您的应用程序提供用户输入。

在它的生命周期中,主循环是您的应用程序将花费99%的时间。

但是,一旦你退出你的应用程序,主循环终止并将所有这些用户界面元素和世界关闭。然后主循环之后的其余行将被执行。在这些中,你正在试图构建一个画布并将其附加到已经被销毁的世界,因此出现了错误信息。

相关问题