Search code examples
pythonbuttontkinterminesweeper

Changing button text with button click not working


I am programming Minesweeper. I have completed all of the logic and now I am just doing the GUI. I am using Tkinter. With so many spaces on the board, I want to automate the creating of all these buttons, which I have done this way:

button_list = []

def create_buttons():
    # Create the buttons
    for x in range(code_squares):
        # Code_squares is how many squares are on the board
        new_button = Button(frame_list[x], text = "", relief = RAISED)
        new_button.pack(fill=BOTH, expand=1)
        new_button.bind("<Button-1>", lambda event: box_open(event, x))
        button_list.append(new_button)

def box_open(event, x):
    if box_list[x] == "M":
        # Checks if the block is a mine
        button_list[x].config(text="M", relief = SUNKEN)
        # Stops if it was a mine
        root.quit()
    else:
        # If not a mine, it changes the button text to the xth term in box_list, which is the amount of nearby mines.
        print("in")
        button_list[x].config(text=box_list[x], relief = SUNKEN)

The print statement is just a test. When I click a spot, it will execute the print statement, so I know its getting there, but it will not change the button text. All help is much appreciated!


Solution

  • I believe the issue is the way you're trying to embed x in your lambda, give this a try instead to see if it solves your problem:

    from functools import partial
    
    def create_buttons():
        for n in range(code_squares):
            # Code_squares is how many squares are on the board
            new_button = Button(frame_list[n], text="", relief=RAISED)
            new_button.pack(fill=BOTH, expand=1)
            new_button.bind("<Button-1>", partial(box_open, x=n))
            button_list.append(new_button)
    
    def box_open(event, x):
        if box_list[x] == "M":
            # Checks if the block is a mine
            button_list[x].config(text="M", relief=SUNKEN)
            # Stops if it was a mine
            root.quit()
        else:
            # If not a mine, it changes the button text to the xth
            # term in box_list, which is the amount of nearby mines.
            button_list[x].config(text=box_list[x], relief=SUNKEN)
    
    button_list = []