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

如何在Tkinter的帧列表中定位并修改特定按钮文本?

解决Tkinter中定位帧内按钮修改文本的问题

你的问题在于循环内定义的button是局部变量,既没有和对应的frame绑定,也没有被全局保存,所以无法通过frame[i].button[j][k]访问。下面提供两种可行的解决方式:

方式一:将按钮列表绑定为Frame的属性

在创建每个Frame的按钮矩阵后,把这个矩阵赋值给Frame对象的自定义属性,这样就能通过Frame直接访问内部按钮:

import tkinter

def change_value(x, y, z):
    # 通过frame[x]的buttons属性定位按钮并修改文本
    frame[x].buttons[y][z]["text"] = f"({x},{y},{z})"

if __name__ == '__main__': 
    window = tkinter.Tk()

    frame = []
    for i in range(9):
        f = tkinter.Frame(window, bg="red", padx=5, pady=5)
        f.grid(row=i//3, column=i%3)  # 给Frame添加布局,否则无法显示
        frame.append(f)

        # 创建按钮矩阵
        button = [[0,0,0],
                  [0,0,0],
                  [0,0,0]]
        for j in range(3):
            for k in range(3):
                button[j][k] = tkinter.Button(f, text="yo", padx=2, pady=2, 
                                              command=lambda x=i, y=j, z=k: change_value(x,y,z))
                button[j][k].grid(row=j,column=k)
        # 将按钮矩阵绑定为当前Frame的属性
        f.buttons = button

    window.mainloop()

方式二:使用全局按钮三维列表

单独维护一个全局的三维列表,存储所有Frame的按钮矩阵,通过索引直接定位目标按钮:

import tkinter

def change_value(x, y, z):
    # 直接通过全局buttons列表定位按钮
    buttons[x][y][z]["text"] = f"({x},{y},{z})"

if __name__ == '__main__': 
    window = tkinter.Tk()

    frame = []
    buttons = []  # 全局存储所有按钮的三维列表
    for i in range(9):
        f = tkinter.Frame(window, bg="red", padx=5, pady=5)
        f.grid(row=i//3, column=i%3)
        frame.append(f)

        button = [[0,0,0],
                  [0,0,0],
                  [0,0,0]]
        for j in range(3):
            for k in range(3):
                button[j][k] = tkinter.Button(f, text="yo", padx=2, pady=2, 
                                              command=lambda x=i, y=j, z=k: change_value(x,y,z))
                button[j][k].grid(row=j,column=k)
        # 将当前Frame的按钮矩阵加入全局列表
        buttons.append(button)

    window.mainloop()

注:原代码未给Frame添加布局逻辑,运行后无法看到组件,示例中已补充grid布局让9个Frame按3×3排列显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:07