如何在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获取,需要通过实例变量存储用户选择的符号,具体修改如下:
- 在
__init__方法中添加实例变量,用于存储用户选择的符号:
self.player_symbol = None
- 修改
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()
- 修改
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
相关产品推荐
相关产品推荐

