如何修改在循环中创建的按钮上显示的文本?

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 的创建和配置都涉及多个步骤。

  1. 已创建基本 Button 小部件。
  2. 然后定义了一个函数,只要单击它就会被调用。请注意如何为函数参数赋予新小部件的默认值。
  3. 最后,新按钮配置为调用新定义的函数。

事情必须这样做,因为在 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()