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

Tkinter运行井字棋报错_tkinter.TclError: unknown option "-1" 如何解决?

报错原因分析

你遇到的_tkinter.TclError: unknown option "-X"报错核心来自两个逻辑错误:

  • 第一:按钮属性访问语法错误。Tkinter 按钮控件的类字典取值语法仅用于访问控件的官方配置属性(比如text、width等),你写的b[str(r)][str(c)] = playerA相当于尝试访问按钮不存在的0/1/2配置项,Tkinter 解析时会自动给配置名前加-前缀,因此点击第几行就会报对应-行号的未知选项错误。
  • 第二:全局变量b仅指向最后创建的按钮。你在循环中每次给b赋新创建的按钮对象,循环结束后b永远是最后生成的第三行最后一列的按钮,即使语法正确,也没法修改你点击的对应按钮的文本。
修复方案

你原本声明的board列表仅存储了无意义的数字,没有实际存储按钮对象,修改思路是把所有生成的按钮存入board,点击时通过传入的行号、列号取出对应按钮修改文本即可。
修复后可正常运行的代码如下:

from tkinter import *

root = Tk()
frame = Frame(root)
frame.pack()

playerA = 'X'
playerB = 'O'

def change_button_value_after_click(r, c):
    # 从board列表取出对应位置的按钮
    target_btn = board[r][c]
    if target_btn['text'] == "":
        # 修改按钮的text属性为玩家标识
        target_btn['text'] = playerA
    else:
        print("This button was clicked!")

# board改为存储按钮对象的二维列表
board = []
for row in range(3):
    row_btns = []
    for col in range(3):
        b = Button(frame, text="", width=5,
        command=lambda r=row,c=col:change_button_value_after_click(r,c))
        b.grid(row=row, column=col)
        row_btns.append(b)
    board.append(row_btns)

root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:54:10