2013-04-05 27 views
25

Quando disegno una forma utilizzando:Come cancellare Tkinter Canvas?

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

Does Tkinter tenere traccia del fatto che è stato creato?

In un semplice gioco che sto creando, il mio codice ha uno Frame creare un gruppo di rettangoli, quindi disegnare un grande rettangolo nero per cancellare lo schermo, quindi disegnare un altro insieme di rettangoli aggiornati e così via.

Sto creando migliaia di oggetti rettangolo in memoria?

So che è possibile assegnare il codice sopra a una variabile, ma se non lo faccio e semplicemente disegno direttamente sull'area di disegno, rimane in memoria, o semplicemente disegna i pixel, come in HTML5 tela?

risposta

47

Ogni oggetto su tela è un oggetto di cui Tkinter tiene traccia. Se stai cancellando lo schermo semplicemente disegnando un rettangolo nero, hai effettivamente creato una perdita di memoria - alla fine il tuo programma si bloccherà a causa dei milioni di elementi che sono stati disegnati.

Per cancellare una tela, utilizzare il metodo delete. Dategli il parametro speciale "all" a eliminare tutti gli elementi sulla tela (la stringa "all" "è un tag speciale che rappresenta tutti gli elementi sulla tela):

canvas.delete("all") 

Se si desidera eliminare solo alcune voci sulla tela (come oggetti in primo piano, lasciando gli oggetti di sfondo sul display) è possibile assegnare tag a ciascun elemento, quindi, anziché "all", è possibile fornire il nome di un tag.

Se stai creando un gioco, probabilmente non è necessario eliminare e ricreare elementi. Ad esempio, se si dispone di un oggetto che si sposta sullo schermo, è possibile utilizzare move o coords metodo per spostare l'oggetto.

3

Gli oggetti disegnati sulla tela sono persistenti. create_rectangle restituisce un ID oggetto di cui è necessario tenere traccia. Se non rimuovi i vecchi oggetti, il tuo programma alla fine rallenterà.

Da Fredrik Lundh di An Introduction to Tkinter:

Si noti che gli elementi aggiunti alla tela sono conservati finché non vengono rimossi. Se si desidera modificare il disegno, è possibile utilizzare metodi come coords, itemconfig, e move di modificare le voci, o utilizzare delete per rimuoverli.

+0

C'è un modo per disegnare senza persistenza? –

+1

@TaylorHill: No. Ma come DaveTheScientist puoi usare i tag canvas per raccogliere i tuoi widget canvas. Crea il widget aggiungendo l'argomento 'tags = 'my_tag''. Quindi quando vuoi cancellare lo schermo puoi fare 'canvas.delete ('my_tag')'. Tutti i widget di canvas contrassegnati con ''my_tag'' verranno eliminati. –

1

Sì, credo che si stiano creando migliaia di oggetti. Se stai cercando un modo semplice per eliminarne una serie, usa i tag canvas described here. Ciò consente di eseguire la stessa operazione (come la cancellazione) su un numero elevato di oggetti.

+0

Se assegno un grappolo di forme allo stesso id, come "tile", e faccio il metodo delete sull'id "tile", cancella tutto in una volta? –

+0

@TaylorHill: sì. –

Problemi correlati