Tkinter中create_rectangle绘制网格的性能优化问题
解决Canvas网格循环绘制的性能问题
直接修改已有矩形颜色(推荐方案)
完全可以不用每次创建新矩形,Tkinter的Canvas提供了itemconfig方法,能直接修改已创建图形对象的属性,包括颜色,这是性能最优的方案。
具体步骤:
- 初始化网格时,把每个矩形的ID(
create_rectangle的返回值)存在一个二维列表里 - 后续更新时,直接通过ID调用
itemconfig修改fill(填充色)或outline(边框色)
示例代码:
import tkinter as tk import random root = tk.Tk() canvas = tk.Canvas(root, width=400, height=400) canvas.pack() # 初始化网格并存储每个矩形ID grid_size = 10 rect_size = 40 rect_ids = [] for i in range(grid_size): row = [] for j in range(grid_size): x1, y1 = j * rect_size, i * rect_size x2, y2 = x1 + rect_size, y1 + rect_size rect_id = canvas.create_rectangle(x1, y1, x2, y2, fill="white") row.append(rect_id) rect_ids.append(row) # 模拟循环更新颜色 def update_grid(): # 随机选一个矩形切换颜色 i, j = random.randint(0, grid_size-1), random.randint(0, grid_size-1) current_color = canvas.itemcget(rect_ids[i][j], "fill") new_color = "red" if current_color == "white" else "white" canvas.itemconfig(rect_ids[i][j], fill=new_color) root.after(100, update_grid) update_grid() root.mainloop()
若必须重绘:先删除旧矩形再创建新的
如果因为业务逻辑必须重新创建矩形,那一定要先清理旧的对象——你猜的没错,大量未被清理的矩形对象堆积就是性能下降的核心原因。
清理方式有两种:
- 用
canvas.delete("all")删除画布上所有对象(适合整个画布只有网格的场景) - 给每个矩形添加统一标签,比如创建时加
tags="grid_rect",之后用canvas.delete("grid_rect")只删除网格矩形,不影响其他画布元素
示例代码:
import tkinter as tk import random root = tk.Tk() canvas = tk.Canvas(root, width=400, height=400) canvas.pack() grid_size = 10 rect_size = 40 def redraw_grid(): # 先删除旧网格 canvas.delete("grid_rect") # 重新绘制带标签的网格 for i in range(grid_size): for j in range(grid_size): x1, y1 = j * rect_size, i * rect_size x2, y2 = x1 + rect_size, y1 + rect_size fill_color = random.choice(["white", "red", "blue", "green"]) canvas.create_rectangle(x1, y1, x2, y2, fill=fill_color, tags="grid_rect") root.after(100, redraw_grid) redraw_grid() root.mainloop()
性能说明
- 修改已有对象的方式内存占用稳定,性能最优,是首选方案
- 删除重绘的方式比不清理直接创建好很多,但性能略低于直接修改,适合必须重绘的场景
内容的提问来源于stack exchange,提问作者gvrana
相关产品推荐
相关产品推荐

