2013-04-05 42 views
25

Khi tôi vẽ một hình sử dụng:Làm thế nào để xóa Tkinter Canvas?

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

Liệu Tkinter theo dõi thực tế là nó đã được tạo ra? Trong một trò chơi đơn giản tôi đang thực hiện, mã của tôi có một Frame tạo một loạt các hình chữ nhật và sau đó vẽ một hình chữ nhật lớn màu đen để xóa màn hình, sau đó vẽ một bộ hình chữ nhật được cập nhật khác, v.v.

Tôi có đang tạo hàng nghìn đối tượng hình chữ nhật trong bộ nhớ không?

Tôi biết bạn có thể gán mã ở trên cho biến, nhưng nếu tôi không làm điều đó và chỉ vẽ trực tiếp lên canvas, nó có nằm trong bộ nhớ hay không, chỉ cần vẽ pixel, như trong HTML5 Tranh sơn dầu?

Trả lời

47

Mỗi mục canvas là một đối tượng mà Tkinter theo dõi. Nếu bạn đang xóa màn hình bằng cách chỉ vẽ một hình chữ nhật màu đen, sau đó bạn có hiệu quả đã tạo ra một rò rỉ bộ nhớ - cuối cùng chương trình của bạn sẽ sụp đổ do hàng triệu mặt hàng đã được rút ra.

Để xóa canvas, hãy sử dụng phương thức delete. Cung cấp cho nó các tham số đặc biệt "all" để xóa tất cả các mục trên vải (chuỗi "all" "là thẻ đặc biệt mà đại diện cho tất cả các mục trên vải):

canvas.delete("all") 

Nếu bạn muốn xóa các mục nhất định trên vải (chẳng hạn như các đối tượng nền trước, trong khi để lại các đối tượng nền trên màn hình), bạn có thể gán các thẻ cho mỗi mục, sau đó thay vì "all", bạn có thể cung cấp tên của một thẻ. có thể không cần xóa và tạo lại các mục. Ví dụ: nếu bạn có đối tượng đang di chuyển trên màn hình, bạn có thể sử dụng move hoặc coords phương pháp để di chuyển mục.

3

Các mục được vẽ vào canvas sẽ liên tục. create_rectangle trả về id mục mà bạn cần theo dõi. Nếu bạn không xóa các mục cũ, chương trình của bạn cuối cùng sẽ chậm lại.

Từ Fredrik Lundh của An Introduction to Tkinter:

Lưu ý rằng các mục thêm vào khung được giữ cho đến khi bạn loại bỏ chúng. Nếu bạn muốn thay đổi bản vẽ, bạn có thể sử dụng các phương pháp như coords, itemconfigmove để sửa đổi các mục hoặc sử dụng delete để xóa chúng.

+0

Có cách nào để vẽ mà không có sự kiên trì không? –

+1

@TaylorHill: Không. Nhưng như DaveTheScientist bạn có thể sử dụng thẻ canvas để thu thập các tiện ích canvas của bạn. Tạo widget thêm đối số 'tags = 'my_tag''. Sau đó, khi bạn muốn xóa màn hình, bạn có thể thực hiện 'canvas.delete ('my_tag')'. Tất cả các tiện ích canvas được gắn thẻ với ''my_tag'' sẽ bị xóa. –

1

Có, tôi tin rằng bạn đang tạo hàng nghìn đối tượng. Nếu bạn đang tìm kiếm một cách dễ dàng để xóa nhiều nhóm cùng một lúc, hãy sử dụng thẻ canvas described here. Điều này cho phép bạn thực hiện thao tác tương tự (chẳng hạn như xóa) trên một số lượng lớn các đối tượng.

+0

Nếu tôi chỉ định một loạt các hình dạng cùng một id, chẳng hạn như "ô xếp" và tôi thực hiện phương pháp xóa trên "gạch" id, có xóa tất cả các hình dạng đó cùng một lúc không? –

+0

@TaylorHill: vâng. –

Các vấn đề liên quan