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

Tkinter按钮点击异常:点击按钮却错误修改对应列底部按钮背景

问题原因与解决方案

问题出在你创建二维数组的方式上:

self.buttons = [[None]*50]*3

这种写法并不是创建3个独立的长度为50的列表,而是先创建一个长度为50的列表,再让self.buttons里的3个元素全部指向这个同一个列表。也就是说,self.buttons[0]、self.buttons[1]、self.buttons[2]本质是同一个对象的引用。

所以当你在循环中给self.buttons[i][j]赋值按钮时,每一次赋值都会覆盖同一个列表的第j个位置——最后一次循环(i=2)的赋值会完全覆盖前面i=0、i=1时的操作。最终不管i是0、1还是2,self.buttons[i][j]指向的都是第2行(最后一行)第j列的按钮。这就导致你点击(0,0)或(1,0)时,实际修改的是(2,0)按钮的背景色,只有点击(2,4)时,修改的才是被点击的按钮本身。

修正方法

把二维数组的创建方式改成生成独立子列表的形式,确保每一行都是全新的列表:

self.buttons = [[None for _ in range(50)] for _ in range(3)]
self.text = [[None for _ in range(50)] for _ in range(3)]

修正后的完整代码:

from tkinter import *

def init():
    print("Started")

class App:

    def __init__(self, master):
        # 改用列表推导式创建独立的二维数组
        self.text = [[None for _ in range(50)] for _ in range(3)]
        self.buttons = [[None for _ in range(50)] for _ in range(3)]
        frame = Frame(master)
        
        for i in range(3):
            for j in range(50):
                self.buttons[i][j] = Button(root, command = lambda i=i, j=j : self.led(i, j))
                self.buttons[i][j].config(width = 2, height = 3)
                self.buttons[i][j].grid(row = i, column = j)
        
    def led(self, i, j):
        print(i, j)
        self.buttons[i][j].config(bg = 'blue')
        
init()
root = Tk()
app = App(root)
root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:05:16