事件发生时循环遍历列表并将其显示在屏幕上
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=" ")
我正在创建一个数独游戏,并且生成了一系列创建 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=" ")