2013-04-05 112 views
25

當我使用繪製形狀:如何清除Tkinter帆布?

canvas.create_rectangle(10, 10, 50, 50, color="green") 

是否Tkinter的追蹤的事實,它被創造?

在我製作的一個簡單遊戲中,我的代碼有一個Frame創建了一串矩形,然後繪製一個大的黑色矩形來清除屏幕,然後繪製另一組更新的矩形,依此類推。

我在內存中創建了數以千計的矩形對象嗎?

我知道你可以將上面的代碼分配給一個變量,但是如果我不這樣做,直接繪製到畫布上,是留在內存中,還是隻是繪製像素,就像在HTML5中帆布?

回答

47

每個畫布項目都是Tkinter跟蹤的對象。如果您只是畫一個黑色的矩形來清除屏幕,那麼您實際上已經創建了一個內存泄漏 - 最終由於數百萬個已繪製的項目,您的程序將崩潰。

要清除畫布,請使用delete方法。給它特殊參數"all"刪除畫布上的所有項目(字符串"all"「是表示在畫布上的所有項目一個特殊的標籤):

canvas.delete("all") 

如果你想在畫布上只刪除某些項目(例如前景對象,同時在顯示器上留下背景對象),您可以爲每個項目分配標籤,然後,您可以提供標籤的名稱,而不是"all"

如果您正在創建遊戲,可能不需要刪除和重新創建項目,例如,如果有一個對象在屏幕上移動,則可以使用movecoords移動項目的方法。

3

繪製到畫布上的項目是持久的。 create_rectangle返回您需要跟蹤的項目標識。如果你不刪除舊的項目,你的程序最終會放慢速度。

從弗雷德裏克Lundh的An Introduction to Tkinter

注意添加到畫布的項目被保留,直到您刪除它們。如果您要更改圖形,請使用 coords,itemconfigmove等方法修改這些項目,或使用delete至 刪除它們。

+0

有沒有辦法繪製沒有持久性? – 2013-04-05 17:43:18

+1

@TaylorHill:不可以。但是作爲DaveTheScientist,您可以使用canvas標籤來收集您的畫布小部件。創建添加參數'tags ='my_tag''的小部件。然後,當你想清除屏幕,你可以做'canvas.delete('my_tag')'。所有用「my_tag」標記的畫布小部件都將被刪除。 – 2013-04-05 17:50:16

1

是的,我相信你正在創造數千個物體。如果您正在尋找一種簡單的方法來一次刪除一堆,請使用畫布標籤described here。這使您可以對大量對象執行相同的操作(如刪除)。

+0

如果我將一堆形狀分配了相同的id,例如「tile」,並且我對id「tile」執行了刪除方法,它會立即刪除它們嗎? – 2013-04-05 17:45:20

+0

@泰勒希爾:是的。 – 2013-04-05 17:47:36