我正在创建一个数独游戏,我已经生成了一系列创建9x9网格的按钮。每次点击一个按钮,我希望它循环一个数字1-9的列表(所以如果我想按钮读取6,按钮需要被点击6次)。我已经设法实现了这一点,但是当我将它带到包含网格的主代码时,它不起作用。
#Create a 9x9 (rows x columns) grid of buttons inside the frame
for row_index in range(9):
for col_index in range(9):
if (row_index in {0, 1, 2, 6, 7, 8} and col_index in {3, 4, 5}) or \
(row_index in {3, 4, 5} and col_index in {0, 1, 2, 6, 7, 8}): #Colours a group of 3x3 buttons together to differentiate the board better.
colour = 'gray85'
else:
colour = 'snow'
x = random.randint(1,9)
btn = Button(frame, width = 12, height = 6, bg=colour) #create a button inside frame
btn.grid(row=row_index, column=col_index, sticky=N+S+E+W)
def LeftClick(event, btn):
global position
btn.config(text=list1[position])
position=position+1
if position == len(list1):
position=0
btn.bind("<Button-1>", LeftClick)
知道为什么这不起作用?目前,当我点击按钮时没有任何反应。
答案 0 :(得分:0)
您需要通过向其添加LeftClick()
测试消息来确保调用print('click')
。您还需要将该功能绑定到按钮。在for
循环中添加:
btn.bind("<Button-1>", LeftClick)
LeftClick()
函数需要更新如下:
def LeftClick(event):
next_value = " 123456789 "
try:
current_value = next_value[next_value.index(str(int(event.widget['text']))) + 1]
except ValueError:
current_value = "1"
event.widget.config(text=current_value)
这将读取按钮中的当前文本,并从next_value
中选择要使用的下一个值。这包括允许您取消选择单元格的空间。因此,首先它会失败并被赋予1
的起始值。下一次单击它将读取1
,将其转换为整数并在next_value
中找到值的索引。然后它会在下一个索引处选择值。
要对New Game
按钮进行编码,您需要一次更改每个按钮上的文本,目前您只需要执行上次创建的按钮。为此,您需要保留对您创建的所有按钮的引用。目前,代码用下一个按钮覆盖每个按钮变量。在代码的顶部添加一个空按钮列表:
buttons = []
接下来位于bind下的for
循环中:
buttons.append(btn)
然后您的Clear()
功能可以如下:
def Clear():
for btn in buttons:
btn.config(text=" ")