You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Tkinter中实现可点击变色的响应式网格?

实现Tkinter彩色网格点击变色功能

原代码问题说明

原代码存在两个核心问题:

  • 循环内重复生成color_grid,导致格子颜色被多次随机覆盖,且无法后续追踪修改
  • 未保存矩形ID、未绑定点击事件,无法实现点击变色的交互逻辑

完整解决代码

import tkinter as tk
import random

GRID_SIZE = 5  # 可自定义网格行列数
SQUARE_SIZE = 50  # 可自定义单个格子的尺寸
COLORS = ["green", "yellow"]

def draw_board(canvas):
    # 全局变量存储颜色网格和矩形ID,用于后续修改
    global color_grid, rect_ids
    color_grid = [[random.choice(COLORS) for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]
    rect_ids = []
    for i in range(GRID_SIZE):
        row_ids = []
        for j in range(GRID_SIZE):
            x0, y0 = i * SQUARE_SIZE, j * SQUARE_SIZE
            x1, y1 = x0 + SQUARE_SIZE, y0 + SQUARE_SIZE
            # 创建矩形并保存其ID
            rect_id = canvas.create_rectangle(x0, y0, x1, y1, fill=color_grid[i][j])
            row_ids.append(rect_id)
        rect_ids.append(row_ids)

def on_grid_click(event):
    # 通过点击坐标计算对应的网格位置
    i = event.x // SQUARE_SIZE
    j = event.y // SQUARE_SIZE
    # 校验坐标是否在网格范围内
    if 0 <= i < GRID_SIZE and 0 <= j < GRID_SIZE:
        # 切换当前格子的颜色
        current_color = color_grid[i][j]
        new_color = COLORS[1] if current_color == COLORS[0] else COLORS[0]
        color_grid[i][j] = new_color
        # 更新矩形的填充色
        canvas.itemconfig(rect_ids[i][j], fill=new_color)

if __name__ == "__main__":
    root = tk.Tk()
    root.title("点击变色网格")
    canvas = tk.Canvas(root, width=GRID_SIZE*SQUARE_SIZE, height=GRID_SIZE*SQUARE_SIZE)
    canvas.pack()
    draw_board(canvas)
    # 绑定鼠标左键点击事件
    canvas.bind("<Button-1>", on_grid_click)
    root.mainloop()

关键改进点

  • 初始化时一次性生成color_grid,避免重复随机操作
  • 用rect_ids列表保存每个矩形的ID,方便后续定位修改
  • 新增点击事件处理函数,通过坐标计算定位网格,切换颜色后调用itemconfig更新矩形样式

内容的提问来源于stack exchange,提问作者Harsh Darji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:46:01