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
相关产品推荐
相关产品推荐

