事件发生时循环遍历列表并将其显示在屏幕上

cycling through a list when an event occurs and displaying it on the screen

我正在创建一个数独游戏,并且生成了一系列创建 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)

知道为什么这不起作用吗?目前当我点击按钮时没有任何反应。

您需要通过向其添加 print('click') 测试消息来确保调用 LeftClick()。您还需要将函数绑定到按钮。在你的 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 中选择要使用的下一个值。这包括一个 space 以允许您取消选择一个单元格。所以开始时它会失败并被赋予 1 的起始值。下一次单击它会读取 1,将其转换为整数并在 next_value 中找到该值的索引。然后它选择下一个索引处的值。


要为 New Game 按钮编写代码,您需要一次更改每个按钮上的文本,目前您只能更改最后创建的按钮。为此,您需要保留对您创建的所有按钮的引用。目前代码用下一个覆盖每个按钮变量。在代码的顶部添加一个空按钮列表:

buttons = []

Next 在你的 for 循环中绑定:

buttons.append(btn)    

那么你的Clear()函数可以如下:

def Clear(): 
    for btn in buttons:
        btn.config(text=" ")