You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tkinter同一类中用其他方法的输出设置按钮文本?

井字棋GUI符号显示问题解决

我正在尝试用Tkinter GUI编写一个优化版井字棋游戏,希望通过select_square()方法,根据button_clicked()方法的选择结果,在棋盘按钮上显示对应的X或O。

原代码如下:

from tkinter import *
from board import Board
from player import Player
from functools import partial


class BoardInterface:

    def __init__(self):
        self.all_buttons = []
        self.window = Tk()
        self.window.title("Welcome to Tic-Tac-Toe Game")
        self.choose_symbol()
        self.window.mainloop()


    def choose_symbol(self):
        self.label = Label(text="Choose X/O", font=("Arial", 20, "normal"))
        self.label.grid(row=0, column=0)
        self.button_x = Button(font=('Arial', '10'), height=5, width=10, command=lambda: self.button_clicked(self.button_x))
        self.button_x["text"] = "X"
        self.button_x.grid(row=1, column=0)
        self.button_o = Button(text="O", font=('Arial', '10'), height=5, width=10, command=lambda: self.button_clicked(self.button_o))
        self.button_o.grid(row=1, column=1)

    def button_clicked(self, button):
        if button["text"] == "X":
            self.label.config(text="X selected")
            self.button_x.destroy()
            self.button_o.destroy()
            self.print_board()
            return "x"
        else:
            self.label.config(text="O selected")
            self.button_x.destroy()
            self.button_o.destroy()
            self.print_board()
            return "o"



    def print_board(self):
        index = 0
        for i in range(1,4):
            for j in range(1,4):
                self.button = Button(text=index, font=('Arial', '10'), height=5, width=10, command=partial(self.select_square, index))
                self.button.grid(row=i, column=j)
                self.all_buttons.append(self.button)
                index += 1


    def select_square(self, index):
        print(index)
        self.bname = self.all_buttons[index]
        self.bname["text"] = "X"

修改方案

原代码中button_clicked的返回值无法直接被select_square获取,需要通过实例变量存储用户选择的符号,具体修改如下:

  1. 在__init__方法中添加实例变量,用于存储用户选择的符号:
self.player_symbol = None
  1. 修改button_clicked方法,将选择的符号赋值给self.player_symbol,替代原来的返回值:
def button_clicked(self, button):
    if button["text"] == "X":
        self.label.config(text="X selected")
        self.player_symbol = "X"
    else:
        self.label.config(text="O selected")
        self.player_symbol = "O"
    self.button_x.destroy()
    self.button_o.destroy()
    self.print_board()
  1. 修改select_square方法,使用存储的符号设置按钮文本,同时添加防重复点击判断:
def select_square(self, index):
    print(index)
    target_button = self.all_buttons[index]
    # 避免重复点击同一格子
    if target_button["text"] not in ("X", "O"):
        target_button["text"] = self.player_symbol

修改后的完整代码

from tkinter import *
from board import Board
from player import Player
from functools import partial


class BoardInterface:

    def __init__(self):
        self.all_buttons = []
        self.player_symbol = None  # 新增:存储用户选择的符号
        self.window = Tk()
        self.window.title("Welcome to Tic-Tac-Toe Game")
        self.choose_symbol()
        self.window.mainloop()


    def choose_symbol(self):
        self.label = Label(text="Choose X/O", font=("Arial", 20, "normal"))
        self.label.grid(row=0, column=0)
        self.button_x = Button(font=('Arial', '10'), height=5, width=10, command=lambda: self.button_clicked(self.button_x))
        self.button_x["text"] = "X"
        self.button_x.grid(row=1, column=0)
        self.button_o = Button(text="O", font=('Arial', '10'), height=5, width=10, command=lambda: self.button_clicked(self.button_o))
        self.button_o.grid(row=1, column=1)

    def button_clicked(self, button):
        if button["text"] == "X":
            self.label.config(text="X selected")
            self.player_symbol = "X"
        else:
            self.label.config(text="O selected")
            self.player_symbol = "O"
        self.button_x.destroy()
        self.button_o.destroy()
        self.print_board()


    def print_board(self):
        index = 0
        for i in range(1,4):
            for j in range(1,4):
                self.button = Button(text=index, font=('Arial', '10'), height=5, width=10, command=partial(self.select_square, index))
                self.button.grid(row=i, column=j)
                self.all_buttons.append(self.button)
                index += 1


    def select_square(self, index):
        print(index)
        target_button = self.all_buttons[index]
        # 防止重复点击已选格子
        if target_button["text"] not in ("X", "O"):
            target_button["text"] = self.player_symbol

内容的提问来源于stack exchange,提问作者user20162513

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:15:39