当事件发生时在列表中循环并在屏幕上显示它

时间:2018-01-08 12:03:08

标签: python events button tkinter sudoku

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

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

1 个答案:

答案 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=" ")