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!
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 = []