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

数独游戏开发:如何识别用户输入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:48:10