Python 如何更改嵌套列表中每个按钮的文本?

Python 如何更改嵌套列表中每个按钮的文本?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我环顾四周,尝试了提供的解决方案,但我似乎无法更改我使用双for循环创建的任何按钮的文本 循环在那里,因此我可以将它们添加到列表的列表的按钮的列表中,这样我就可以(假设)通过调用board_button[2][3]或其他方式方便地通过嵌套列表访问它们。在用户输入board_size后,它们也会动态创建,这样它会生成一个由nxn按钮组成的网格。这些都是在一个类方法中完成的,还有另一个类方法,当按钮调用按钮时,它应该更改按钮的文本 我尝试过使用提供的解决方案,但没有一个能解决我的问题 恕我直言,这段

我环顾四周,尝试了提供的解决方案,但我似乎无法更改我使用双
for
循环创建的任何
按钮的
文本

循环在那里,因此我可以将它们添加到<代码>列表的<代码>列表的<代码>按钮的<代码>列表中,这样我就可以(假设)通过调用<代码>board_button[2][3]
或其他方式方便地通过嵌套列表访问它们。在用户输入
board_size
后,它们也会动态创建,这样它会生成一个由nxn按钮组成的网格。这些都是在一个类方法中完成的,还有另一个类方法,当按钮调用
按钮时,它应该更改
按钮的
文本

我尝试过使用提供的解决方案,但没有一个能解决我的问题

恕我直言,这段代码很长,但我真诚地认为,我制作它的方式可能导致了这个问题,并因此提供了更多的见解

从tkinter导入文件对话框
从tkinter进口*
类主窗口(框架):
电路板尺寸=无
文件输入=无
线路板按钮=无
线路板电阻=无
行=[]
定义初始化(自身,父级):
帧。\uuuu初始化(自,父)
#初始化小部件,但不显示它们
self.initWidgets()
#显示起始窗口
self.startWindow()
def generateBoard(自我,忘记=无):
#隐藏调用它的方法的组
如果你忘记无:
因为我想忘记:
self.row[i].forget()
#从用户处获取板的大小
self.board\u size=int(self.size\u entry.get())
#初始化每个按钮的文本变量
self.board_strvars=[]
对于范围内的i(自身板尺寸):
self.row\u strvars=[]
对于范围内的j(自板尺寸):
var=StringVar()
变量集(“”)
self.row\u strvars.append(var)
self.board\u strvars.append(self.row\u strvars)
#在此处插入按钮列表
self.row[1]。打包(填充=X)
self.board_按钮=[]
对于范围内的i(自身板尺寸):
self.row_按钮=[]
对于范围内的j(自板尺寸):
self.row_buttons.append(按钮(self.row[1],textvariable=self.board_strvars[i][j],command=lambda:self.place(i,j)))
self.row_按钮[j]。网格(row=i,column=j)
self.board_按钮.append(self.row_按钮)
#用于“求解”和“返回”按钮
self.row[2].pack(fill=X)
def initWidgets(self):
#创建小部件的行或组
对于范围(3)中的i:
self.row.append(Frame())
#第0行;startWindow
self.size\u entry=entry(self.row[0])
自我尺寸\入口包装(填充=X,侧面=左侧)
self.size_按钮=按钮(self.row[0],text=“Enter”,command=lambda:self.generateBoard([0]))
自尺寸按钮包装(填充=X,侧面=左侧)
self.load\u button=按钮(self.row[0],text=“load”,command=self.loadFile)
自装按钮包装(填充=X,侧面=左侧)
#第2行;发电板
self.solve\u按钮=按钮(self.row[2],text=“solve”,command=self.showSolutions)
self.solve_按钮包(fill=X,side=LEFT)
self.back\u button=button(self.row[2],text=“back”,command=lambda:self.startWindow(to\u forget=[0,2],to\u destroy=[1]))
自背按钮包装(填充=X,侧面=右侧)
def加载文件(自):
打印(“已加载文件!”)
def位置(自我、i、j):
如果self.board\u strvars[i][j].get()=“”:
self.board_strvars[i][j].set(“C”)
其他:
self.board_strvars[i][j].set(“”)
def showSolutions(自我):
打印(“显示解决方案!”)
def startWindow(self,to_忘记=无,to_销毁=无):
#隐藏调用它的方法的组
如果你忘记无:
因为我想忘记:
self.row[i].forget()
#销毁组的子窗口小部件并隐藏组
如果你想毁灭无:
因为我要摧毁:
对于self.row[i].winfo_children()中的子项:
child.destroy()
self.row[i].forget()
self.row[0]。打包(填充=X)
如果名称=“\uuuuu main\uuuuuuuu”:
root=Tk()
根标题(“测试”)
app=main窗口(根)
root.mainloop()
我最初想定义一个函数,该函数将更改调用它的
按钮的
文本。但到目前为止,我还没有找到这样做的方法

按照帖子中提供的解决方案,我没有将任何更改链接到按钮。但在我提供的代码中,我使用了
StringVar()
作为
按钮的
textvariable
。但是,无论单击哪个按钮,它都只会更改最后一行、最后一列按钮元素。它的工作方式应该是,被点击的按钮将改变其文本


谢谢

更改
lambda
函数以强制关闭:

def generateBoard(self, to_forget=None):
    ...

    for i in range(self.board_size):
        self.row_buttons=[]
        for j in range(self.board_size):
            self.row_buttons.append(Button(self.row[1], textvariable=self.board_strvars[i][j], command=lambda i=i, j=j:self.place(i, j)))
            self.row_buttons[j].grid(row=i, column=j)

        self.board_buttons.append(self.row_buttons)
还要注意,最好不要调用自己的方法
place
,因为Tk中已经有了
place
方法