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

2024-09-29 19:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我四处查看并尝试了提供的解决方案,但似乎无法更改我使用双for循环生成的任何textbutton

循环在那里,这样我就可以把它们添加到listlistsbuttons中,这样我就可以(假设)通过调用board_button[2][3]或其他什么来方便地通过嵌套列表访问它们。它们也是在用户输入board_size之后动态创建的,这样它就生成了一个nxn按钮网格。这些都是在一个类方法中完成的,另外一个类方法应该在按钮调用时更改buttontext

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

请原谅这一长段代码,但我真的认为我的制作方法可能导致了这个问题,并因此给出了更多的见解

from tkinter import filedialog
from tkinter import *

class MainWindow(Frame):

    board_size = None
    file_input = None
    board_buttons = None
    board_strvars = None

    row = []

    def __init__ (self, parent):
        Frame.__init__(self, parent)

        # initialize widgets but don't show them yet
        self.initWidgets()
        # show the starting window
        self.startWindow()

    def generateBoard(self, to_forget=None):
        # hides the groups of the method that called it
        if to_forget != None:
            for i in to_forget:
                self.row[i].forget()

        # get the board_size from user
        self.board_size = int(self.size_entry.get())

        # initialize text variables for each button
        self.board_strvars = []
        for i in range(self.board_size):
            self.row_strvars=[]
            for j in range(self.board_size):
                var = StringVar()
                var.set("   ")
                self.row_strvars.append(var)

            self.board_strvars.append(self.row_strvars)

        # insert list of lists of buttons here
        self.row[1].pack(fill=X)

        self.board_buttons = []
        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:self.place(i, j)))
                self.row_buttons[j].grid(row=i, column=j)

            self.board_buttons.append(self.row_buttons)

        # for solve and back button
        self.row[2].pack(fill=X)

    def initWidgets(self):
        # create the rows or groups of widgets
        for i in range(3):
            self.row.append(Frame())

        # row 0; startWindow
        self.size_entry = Entry(self.row[0])
        self.size_entry.pack(fill=X, side=LEFT)

        self.size_button = Button(self.row[0], text="Enter", command=lambda:self.generateBoard([0]))
        self.size_button.pack(fill=X, side=LEFT)

        self.load_button = Button(self.row[0], text="Load", command=self.loadFile)
        self.load_button.pack(fill=X, side=LEFT)


        # row 2; generateBoard
        self.solve_button = Button(self.row[2], text="Solve", command=self.showSolutions)
        self.solve_button.pack(fill=X, side=LEFT)

        self.back_button = Button(self.row[2], text="Back", command=lambda:self.startWindow(to_forget=[0,2], to_destroy=[1]))
        self.back_button.pack(fill=X, side=RIGHT)

    def loadFile(self):
        print("file loaded!")

    def place(self, i, j):
        if self.board_strvars[i][j].get() == "   ":
            self.board_strvars[i][j].set("C")
        else:
            self.board_strvars[i][j].set("   ")

    def showSolutions(self):
        print("solutions shown!")


    def startWindow(self, to_forget=None, to_destroy=None):
        # hides the groups of the method that called it
        if to_forget != None:
            for i in to_forget:
                self.row[i].forget()

        # destroys the groups' child widgets and hides the group
        if to_destroy != None:
            for i in to_destroy:
                for child in self.row[i].winfo_children():
                    child.destroy()
                self.row[i].forget()

        self.row[0].pack(fill=X)

if __name__ == "__main__":
    root=Tk()
    root.title("test")
    app = MainWindow(root)
    root.mainloop()

我最初想定义一个函数来改变调用它的textbutton。但到目前为止我还没找到办法

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

谢谢


Tags: thetotextinselfboardnonefor
1条回答
网友
1楼 · 发布于 2024-09-29 19:34:02

更改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方法

相关问题 更多 >

    热门问题