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

Python Tkinter GUI开发报错:回调函数未定义,求实现点击变色方格

解决Tkinter网格点击变色的「回调函数未定义」问题

嘿,我看到你在用Tkinter开发网格点击变色功能时遇到了回调相关的错误,咱们来一步步把问题解决掉!

首先先梳理下你原代码里的几个核心问题:

  • 循环里的range(10...是语法错误,应该写成range(10)
  • 没有为每个方格保存独立引用,导致回调函数无法定位到被点击的具体方格
  • 回调函数的写法不对,既没有绑定到具体的方格组件,也没有正确的参数来接收点击事件
  • 原代码里self.squares.bg = 'red'的写法不符合Tkinter修改组件属性的规范,应该用config()方法

下面给你两种可行的实现方案,你可以根据需求选择:

方案一:用Button组件实现方格

这种方式简单直接,每个方格就是一个Button,点击时触发回调修改背景色:

from tkinter import *

root = Tk()
root.title("点击变色网格")

class Application(Frame):
    def __init__(self, master, *args, **kwargs):
        Frame.__init__(self, master, *args, **kwargs)
        self.grid()  # 别忘了把Frame挂载到窗口上,否则界面不显示
        self.squares = []  # 用二维列表保存所有方格的引用
        self.createWidgets()

    def mouse_click(self, square):
        # 把被点击的方格背景改成红色
        square.config(bg='red')

    def createWidgets(self):
        for i in range(10):
            row_squares = []
            for j in range(10):
                # 创建白色背景的Button作为方格,调整width/height控制大小
                square = Button(self, bg='white', width=2, height=1)
                # 用lambda绑定回调,把当前square作为参数传入,避免所有按钮绑定到最后一个方格
                square.config(command=lambda s=square: self.mouse_click(s))
                square.grid(row=i, column=j)
                row_squares.append(square)
            self.squares.append(row_squares)

app = Application(root)
root.mainloop()

方案二:用Canvas绘制矩形方格

如果需要更灵活的图形控制,可以用Canvas来画方格,通过坐标计算定位点击的区域:

from tkinter import *

root = Tk()
root.title("Canvas网格点击变色")

class Application(Frame):
    def __init__(self, master, *args, **kwargs):
        Frame.__init__(self, master, *args, **kwargs)
        self.grid()
        self.canvas = Canvas(self, width=200, height=200)
        self.canvas.grid()
        self.square_size = 20  # 每个方格的边长
        self.createWidgets()

    def mouse_click(self, event):
        # 根据点击坐标计算对应的方格位置
        x_col = event.x // self.square_size
        y_row = event.y // self.square_size
        # 获取对应方格的ID,修改填充色为红色
        square_id = self.squares[y_row][x_col]
        self.canvas.itemconfig(square_id, fill='red')

    def createWidgets(self):
        self.squares = []
        for i in range(10):
            row_ids = []
            for j in range(10):
                # 计算每个方格的左上角和右下角坐标
                x1 = j * self.square_size
                y1 = i * self.square_size
                x2 = x1 + self.square_size
                y2 = y1 + self.square_size
                # 绘制白色矩形方格,带黑色边框
                square_id = self.canvas.create_rectangle(x1, y1, x2, y2, fill='white', outline='black')
                row_ids.append(square_id)
            self.squares.append(row_ids)
        # 绑定Canvas的左键点击事件到回调函数
        self.canvas.bind("<Button-1>", self.mouse_click)

app = Application(root)
root.mainloop()

这两种方案都能解决你遇到的回调问题,而且实现了点击方格变红色的需求。你可以根据自己的实际场景选择合适的方式~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:57:10