数独游戏开发:如何识别用户输入的Entry组件的[i][j]位置?
解决Tkinter数独游戏中获取输入Entry的[i][j]索引问题
有两种简单方法可以获取用户正在输入的Entry对应的[i][j]索引,直接用于输入校验:
方法一:给Entry添加自定义索引属性
创建每个Entry组件时,直接给它绑定对应的行、列索引,事件触发时就能从组件上直接拿到索引值。
修改后的完整代码
import tkinter as tk # 假设board是你的初始数独数组,answer是答案数组 board = [[0]*9 for _ in range(9)] answer = [[0]*9 for _ in range(9)] puzzle = tk.Tk() puzzle.title("数独游戏") blocks = [] for i in range(3): row = [] for j in range(3): frame = tk.Frame(puzzle, bd=1, highlightbackground='#ccddff', highlightcolor='#000000', highlightthickness=2) frame.grid(row=i, column=j, sticky='nsew', padx=5, pady=5) row.append(frame) blocks.append(row) # 输入校验函数 def check_input(event): entry = event.widget # 直接从Entry组件获取对应的[i][j]索引 i = entry.row j = entry.col input_val = entry.get().strip() # 这里替换成你的校验逻辑,比如和答案对比 if input_val and input_val == str(answer[i][j]): print(f"位置[{i}][{j}]输入正确") else: print(f"位置[{i}][{j}]输入错误") inblock = [] for i in range(9): inrow = [] for j in range(9): frm_cell = tk.Frame(blocks[i // 3][j // 3]) frm_cell.grid(row=(i % 3), column=(j % 3), sticky='nsew', padx=5, pady=5) frm_cell.rowconfigure(0, minsize=50, weight=1) frm_cell.columnconfigure(0, minsize=50, weight=1) var = tk.StringVar() en = tk.Entry(frm_cell, relief='raised', bg='white', justify="center", textvariable=var, width=5) en.grid(sticky='nsew') # 给Entry添加自定义属性,存储行、列索引 en.row = i en.col = j # 绑定校验事件,这里用失去焦点触发,也可以换成<KeyRelease>或<Return> en.bind("<FocusOut>", check_input) if str(board[i][j]) != "0": en.config(state='readonly', font="bold", fg="#001a4d") else: # 原代码这里重新创建StringVar会导致绑定失效,直接保留初始var即可 en.config(state='normal') var.set(str(board[i][j])) inrow.append(en) inblock.append(inrow) puzzle.mainloop()
方法二:用Lambda绑定事件时传递索引
如果不想给Entry加自定义属性,也可以在绑定事件时,通过lambda把i和j直接传递给校验函数:
核心修改部分
# 调整校验函数,直接接收索引参数 def check_input(i, j, event): input_val = event.widget.get().strip() if input_val and input_val == str(answer[i][j]): print(f"位置[{i}][{j}]输入正确") else: print(f"位置[{i}][{j}]输入错误") # 创建Entry时绑定事件,用lambda传递索引 en.bind("<FocusOut>", lambda e, row=i, col=j: check_input(row, col, e))
注意事项
- 原代码中
else分支重新创建tk.StringVar()会导致输入框绑定失效,无法正常显示/同步内容,必须删除这行。 - 事件类型可以根据需求调整:比如用
<KeyRelease>实时校验输入,或者<Return>按下回车时校验。
内容的提问来源于stack exchange,提问作者Christian Paul Calso
相关产品推荐
相关产品推荐

