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

Python 事件发生时在列表中循环并在屏幕上显示,python,events,button,tkinter,sudoku,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

我正在创建一个数独游戏,我已经生成了一系列按钮,创建了一个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)
#在框架内创建9x9(行x列)按钮网格
对于范围(9)中的行索引:
对于范围(9)中的列索引:
if(在{0,1,2,6,7,8}中的行索引和在{3,4,5}中的列索引)或\
(在{3,4,5}中的行索引和在{0,1,2,6,7,8}中的列索引):#将一组3x3按钮组合在一起以更好地区分电路板。
颜色='gray85'
其他:
颜色=‘雪’
x=random.randint(1,9)
btn=按钮(框架,宽度=12,高度=6,背景=颜色)#在框架内创建一个按钮
btn.网格(行=行索引,列=列索引,粘性=N+S+E+W)
def LeftClick(事件,btn):
全球地位
btn.config(text=list1[position])
位置=位置+1
如果位置==len(列表1):
位置=0
btn.bind(“,左键单击)

你知道为什么这样不行吗?当前,当我单击按钮时,不会发生任何事情。

您需要通过向其添加
print('click')
测试消息来确保调用
LeftClick()
。您还需要将函数绑定到按钮。将此添加到
for
循环中:

btn.bind("<Button-1>", LeftClick)
这将读取按钮中的当前文本,并从
next\u value
中选择要使用的下一个值。这包括一个允许您取消选择单元格的空间。因此,从它开始将失败,并给出一个起始值
1
。下一次单击它将读取
1
,将其转换为整数,并在
next\u value
中找到该值的索引。然后它在下一个索引中选取值


要对
新游戏
按钮进行编码,您需要一次一个地更改每个按钮上的文本,目前您只需执行上次创建的按钮。要做到这一点,您需要保留对您创建的所有按钮的引用。当前,代码将用下一个按钮变量覆盖每个按钮变量。在代码顶部添加一个空按钮列表:

buttons = []
在绑定下的
for
循环中的下一步:

buttons.append(btn)    
然后您的
Clear()
函数可以如下所示:

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)
def Clear(): 
    for btn in buttons:
        btn.config(text=" ") 

我已经实现并试用过了,但是它仍然没有在我的按钮网格上显示任何数字。这个函数正在被调用吗?向它添加一个
print()
语句来测试它。应该调用它-我已将按钮单击与函数btn.bind(“,LeftClick)同步我的codeCorrection上有这个-我向函数添加了print,但没有输出任何内容。有什么想法吗?我不明白你的意思-我已经包括了我的样本代码。复制/粘贴你的样本有什么作用吗?没有,样本没有任何作用-我说了。单击按钮时,它将保持空白。不幸的是,我不能显示实际结果,因为我没有gyazo或类似的东西,打印屏幕不能在这里打印。抱歉,如果您没有时间阅读,我也没有时间帮助您。@JamesAnderson示例执行某些操作时,会引发异常。