如何修改在循环中创建的按钮上显示的文本?
How to modify the text displayed on Buttons created in a loop?
我需要做一个井字游戏,但我对如何将单元格的值从“-”更改为“X”或“O”感到困惑,
从昨天开始我一直在网上寻找如何告诉程序“用户点击单元格[0][2]”,我不知道如何告诉程序用户按下了哪个单元格。
这是我的代码:
import tkinter as tk
buttons = []
window = tk.Tk()
frame_title = tk.Frame(master=window)
tk.Label(text="Tic tac toe", master=frame_title).pack()
frame_title.pack()
frame_body = tk.Frame(master=window)
frame_body.rowconfigure(0, minsize=50, weight=1)
frame_body.rowconfigure(1, minsize=50, weight=1)
frame_body.rowconfigure(2, minsize=50, weight=1)
frame_body.columnconfigure([0, 1, 2], minsize=50, weight=1)
for i in range(3):
for j in range(3):
new_button = tk.Button(master=frame_body, text="-", command=value_change)
new_button.grid(row=i, column=j, sticky="nsew")
frame_body.pack()
window.mainloop()
这就是这段代码的作用:
tic tac toe
这是我做过的最好的尝试:
def value_change():
turn = 0
if turn == 0:
new_button["text"] = "X"
turn += 1
else:
new_button["text"] = "O"
turn -= 1
但是这个,如果我点击任何单元格,只会改变单元格的值[2][2]。
如果我按 [0] [2] 我需要更改此单元格的值
我正在使用模块 tkinter 因为这是老师在 class 中用来教如何制作一个增加和减少的计数器的东西,但是如果我点击“ +" cell[0][0] 或 "-"[0][2] 它只改变了单元格 [zero][one]
上数字的值
如果您知道我在哪里可以阅读有关如何使用 tkinter 执行此操作的示例,我将不胜感激。
这里是如何做你想做的。它类似于评论中提到的@Bryan Oakley 问题的最高评分 answer,但以更易读的方式做事,并通过显示 value_change()
函数所需的修改以使其工作而更进一步正确。
每个 Button
的创建和配置都涉及多个步骤。
- 已创建基本
Button
小部件。
- 然后定义了一个函数,只要单击它就会被调用。请注意如何为函数参数赋予新小部件的默认值。
- 最后,新按钮配置为调用新定义的函数。
事情必须这样做,因为在 Button
存在之前,回调函数不能用默认参数编写,并且函数不能分配给 Button
直到它存在。
您的 value_change()
函数已更改为接受作为参数传递的 Button
。此外,变量 turn
已被声明为 global
,因此它不是局部变量,可以在函数调用之间保留其值并使其能够正确跟踪谁在移动它。
import tkinter as tk
buttons = []
window = tk.Tk()
frame_title = tk.Frame(master=window)
tk.Label(text="Tic tac toe", master=frame_title).pack()
frame_title.pack()
turn = 0 # Define global variable.
def value_change(btn):
global turn # Prevent creation of local variable and use global one.
if turn == 0:
btn["text"] = "X"
turn += 1
else:
btn["text"] = "O"
turn -= 1
frame_body = tk.Frame(master=window)
frame_body.rowconfigure(0, minsize=50, weight=1)
frame_body.rowconfigure(1, minsize=50, weight=1)
frame_body.rowconfigure(2, minsize=50, weight=1)
frame_body.columnconfigure([0, 1, 2], minsize=50, weight=1)
frame_body.pack()
for i in range(3):
for j in range(3):
new_button = tk.Button(master=frame_body, text="-") # Create button.
def handler(btn=new_button): # Define function to be called when it's clicked.
return value_change(btn)
new_button['command'] = handler # Associate the function with button.
new_button.grid(row=i, column=j, sticky="nsew")
window.mainloop()
我需要做一个井字游戏,但我对如何将单元格的值从“-”更改为“X”或“O”感到困惑,
从昨天开始我一直在网上寻找如何告诉程序“用户点击单元格[0][2]”,我不知道如何告诉程序用户按下了哪个单元格。
这是我的代码:
import tkinter as tk
buttons = []
window = tk.Tk()
frame_title = tk.Frame(master=window)
tk.Label(text="Tic tac toe", master=frame_title).pack()
frame_title.pack()
frame_body = tk.Frame(master=window)
frame_body.rowconfigure(0, minsize=50, weight=1)
frame_body.rowconfigure(1, minsize=50, weight=1)
frame_body.rowconfigure(2, minsize=50, weight=1)
frame_body.columnconfigure([0, 1, 2], minsize=50, weight=1)
for i in range(3):
for j in range(3):
new_button = tk.Button(master=frame_body, text="-", command=value_change)
new_button.grid(row=i, column=j, sticky="nsew")
frame_body.pack()
window.mainloop()
这就是这段代码的作用:
tic tac toe
这是我做过的最好的尝试:
def value_change():
turn = 0
if turn == 0:
new_button["text"] = "X"
turn += 1
else:
new_button["text"] = "O"
turn -= 1
但是这个,如果我点击任何单元格,只会改变单元格的值[2][2]。
如果我按 [0] [2] 我需要更改此单元格的值
我正在使用模块 tkinter 因为这是老师在 class 中用来教如何制作一个增加和减少的计数器的东西,但是如果我点击“ +" cell[0][0] 或 "-"[0][2] 它只改变了单元格 [zero][one]
上数字的值如果您知道我在哪里可以阅读有关如何使用 tkinter 执行此操作的示例,我将不胜感激。
这里是如何做你想做的。它类似于评论中提到的@Bryan Oakley 问题的最高评分 answer,但以更易读的方式做事,并通过显示 value_change()
函数所需的修改以使其工作而更进一步正确。
每个 Button
的创建和配置都涉及多个步骤。
- 已创建基本
Button
小部件。 - 然后定义了一个函数,只要单击它就会被调用。请注意如何为函数参数赋予新小部件的默认值。
- 最后,新按钮配置为调用新定义的函数。
事情必须这样做,因为在 Button
存在之前,回调函数不能用默认参数编写,并且函数不能分配给 Button
直到它存在。
您的 value_change()
函数已更改为接受作为参数传递的 Button
。此外,变量 turn
已被声明为 global
,因此它不是局部变量,可以在函数调用之间保留其值并使其能够正确跟踪谁在移动它。
import tkinter as tk
buttons = []
window = tk.Tk()
frame_title = tk.Frame(master=window)
tk.Label(text="Tic tac toe", master=frame_title).pack()
frame_title.pack()
turn = 0 # Define global variable.
def value_change(btn):
global turn # Prevent creation of local variable and use global one.
if turn == 0:
btn["text"] = "X"
turn += 1
else:
btn["text"] = "O"
turn -= 1
frame_body = tk.Frame(master=window)
frame_body.rowconfigure(0, minsize=50, weight=1)
frame_body.rowconfigure(1, minsize=50, weight=1)
frame_body.rowconfigure(2, minsize=50, weight=1)
frame_body.columnconfigure([0, 1, 2], minsize=50, weight=1)
frame_body.pack()
for i in range(3):
for j in range(3):
new_button = tk.Button(master=frame_body, text="-") # Create button.
def handler(btn=new_button): # Define function to be called when it's clicked.
return value_change(btn)
new_button['command'] = handler # Associate the function with button.
new_button.grid(row=i, column=j, sticky="nsew")
window.mainloop()