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

如何在Tkinter的for循环中正确使用get方法?代码问题排查

解决Tkinter循环中Entry.get()无法获取输入的问题

嘿,我来帮你分析下问题所在,以及怎么解决:

为什么你的代码里get()不工作?

你现在的写法有两个核心问题:

  1. 时机不对:循环执行的时候,界面刚创建完输入框,用户根本还没来得及输入内容,这时候调用get()拿到的自然是空字符串。
  2. 变量被覆盖:每次循环都会把Entry_answer指向新的输入框实例,循环结束后,这个变量只会保留最后一个输入框的引用,之前的输入框都找不到了。

下面给你两种实用的解决方案:


方案一:用列表存输入框,通过按钮提交获取内容

这是最常用的方式,先把所有输入框存起来,等用户输入完点击按钮时再统一获取:

import tkinter as tk

root = tk.Tk()
# 假设你的数据是这些(可以替换成自己的)
questions = ["问题1: 苹果的英文?", "问题2: 黄色的英文?", "问题3: 数字2的英文?"]
answer_choices = ["A.Apple B.Banana", "A.Red B.Yellow", "A.One B.Two"]
correct_choices = ["A", "B", "B"]
correct_answers = ["Apple", "Yellow", "Two"]

# 用来保存所有输入框实例的列表
entry_list = []
rn = 0

for question, answer_choice, _, correct_ans in zip(questions, answer_choices, correct_choices, correct_answers):
    frameQ = tk.Frame(root)
    frameQ.grid(row=rn, columnspan=4, sticky="w", pady=5)
    
    # 先把问题和选项显示出来,让界面更友好
    tk.Label(frameQ, text=question).grid(row=0, column=0, sticky="w")
    tk.Label(frameQ, text=f"选项: {answer_choice}").grid(row=1, column=0, sticky="w")
    
    Entry_answer = tk.Entry(frameQ, width=20)
    Entry_answer.grid(row=3, column=0, sticky="w")
    # 把当前输入框加入列表,避免被覆盖
    entry_list.append((Entry_answer, correct_ans))
    
    rn += 1

def submit_answers():
    """点击按钮时获取所有输入并校验"""
    print("===== 提交结果 =====")
    for idx, (entry, correct_ans) in enumerate(entry_list):
        user_answer = entry.get().strip()
        print(f"第{idx+1}题输入: {user_answer}")
        if user_answer == correct_ans:
            print(f"第{idx+1}题 ✅ 回答正确")
        else:
            print(f"第{idx+1}题 ❌ 回答错误,正确答案是: {correct_ans}")

# 添加提交按钮
tk.Button(root, text="提交答案", command=submit_answers, padx=10).grid(row=rn, column=0, pady=10)

root.mainloop()

方案二:实时校验输入(用户输入时就判断对错)

如果需要用户输入后立刻反馈,可以给输入框绑定键盘事件:

import tkinter as tk

root = tk.Tk()
questions = ["问题1: 苹果的英文?", "问题2: 黄色的英文?", "问题3: 数字2的英文?"]
answer_choices = ["A.Apple B.Banana", "A.Red B.Yellow", "A.One B.Two"]
correct_choices = ["A", "B", "B"]
correct_answers = ["Apple", "Yellow", "Two"]

rn = 0

def check_input(event, correct_ans):
    """用户输入时触发的校验函数"""
    entry = event.widget
    user_answer = entry.get().strip()
    if user_answer == correct_ans:
        entry.config(fg="green")  # 正确时文字变绿
    else:
        entry.config(fg="red")    # 错误时文字变红

for question, answer_choice, _, correct_ans in zip(questions, answer_choices, correct_choices, correct_answers):
    frameQ = tk.Frame(root)
    frameQ.grid(row=rn, columnspan=4, sticky="w", pady=5)
    
    tk.Label(frameQ, text=question).grid(row=0, column=0, sticky="w")
    tk.Label(frameQ, text=f"选项: {answer_choice}").grid(row=1, column=0, sticky="w")
    
    Entry_answer = tk.Entry(frameQ, width=20)
    Entry_answer.grid(row=3, column=0, sticky="w")
    # 绑定按键释放事件,同时传递正确答案(注意lambda的参数写法,避免循环变量问题)
    Entry_answer.bind("<KeyRelease>", lambda e, ans=correct_ans: check_input(e, ans))
    
    rn += 1

root.mainloop()

核心总结

  • 别在创建输入框的循环里直接调用get(),那时候用户还没输入,肯定拿不到有效内容。
  • 一定要保存每个输入框的引用(比如用列表),不然循环结束后只能访问最后一个输入框。
  • 获取输入的操作要在用户交互之后触发:比如点击按钮、输入文字时的事件。

内容的提问来源于stack exchange,提问作者Nelson Rico Helasque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:26:53