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

Tkinter开发数独求解器输入单个Entry导致所有Entry同步填充问题

问题根源

  • 输入同步问题:Tkinter的Entry控件的textvariable参数必须接收Tkinter内置的可变变量对象(如StringVar),你当前传入的是普通Python字符串"0",所有Entry本质上绑定了同一个不可变的字符串值,才会出现输入同步的问题。
  • 数组不更新问题:普通Python列表里的字符串是不可变类型,即使修改输入框内容也不会反向同步到你声明的input数组中。

修正代码

import tkinter as tk
from tkinter import Entry, Button

root = tk.Tk()
N = 9
# 把数组元素改为Tkinter的StringVar对象,支持双向绑定
input_vars = [[tk.StringVar(value="0") for _ in range(N)] for _ in range(N)]

for i in range(N):
    for j in range(N):
        new_col = j // 3
        new_row = i // 3
        colour = "lightgrey" if (-1)**(new_col+new_row) == 1 else "white"
        entry = Entry(root, width=10, bg=colour, textvariable=input_vars[i][j])
        entry.grid(row=i, column=j)

# 实现Set按钮对应的逻辑
def set_values():
    # 读取所有输入值生成数独数组
    sudoku_board = []
    for i in range(N):
        row = []
        for j in range(N):
            val = input_vars[i][j].get().strip()
            # 非法输入默认转为0
            row.append(int(val) if val.isdigit() and 1<=int(val)<=9 else 0)
        sudoku_board.append(row)
    # 后续可在此处添加数独盘面展示、求解逻辑
    print("当前输入的数独盘面:")
    for row in sudoku_board:
        print(row)

set_button = Button(root, text="Set", command=set_values, padx=20, pady=10)
set_button.grid(row=10,column=3, columnspan=3)

root.mainloop()

注意事项

  • 不要用input作为变量名,这是Python内置的输入函数关键字,重名会导致后续无法调用原生输入功能。
  • 所有需要和控件双向绑定的变量都必须使用Tkinter提供的StringVar/IntVar/BooleanVar等可变变量类,普通Python基础类型无法实现控件值的同步更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 06:24:07