2016-08-26 72 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%的時間。

但是,一旦你退出你的應用程序,主循環終止並將所有這些用戶界面元素和世界關閉。然後主循環之後的其餘行將被執行。在這些中,你正在試圖構建一個畫布並將其附加到已經被銷燬的世界,因此出現了錯誤信息。

相關問題