如何在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
相关产品推荐
相关产品推荐

