如何用for循环创建Tkinter按钮与输入框并获取输入内容?
问题解决:Tkinter循环创建按钮后无法获取输入框内容
核心问题分析
你的代码存在两个关键错误:
- 提前引用未初始化对象:定义
login_btn时直接使用entry_dict['Username'],但entry_dict要在create_entry()调用后才生成,此时会触发KeyError。 - 按钮命令执行时机错误:
command=get_inside_username(field['object'])会在创建按钮时立即执行函数,而非点击按钮时触发。
修正后的完整代码
import tkinter as tk window = tk.Tk() window.title("Login Menu") login_ents = {'Username': {'window': window, 'width': 40}} # 改为存储关联的输入框键名,而非提前引用未创建的对象 login_btn = {'Go': {'text': 'Go', 'window': window, 'entry_name': 'Username'}} def get_inside_username(e): print(e.get()) return e.get() def create_entry(): ents = {} for ent, field in login_ents.items(): entry = tk.Entry(field['window'], width=field['width']) entry.pack(pady=5) ents[ent] = entry return ents def create_button(entry_dict): btns = {} for btn, field in login_btn.items(): # 使用lambda绑定输入框对象,默认参数避免循环变量覆盖问题 button = tk.Button( field['window'], text=field['text'], command=lambda e=entry_dict[field['entry_name']]: get_inside_username(e) ) button.pack(pady=5) btns[btn] = button return btns # 先创建输入框,再传入按钮创建函数 entry_dict = create_entry() button_dict = create_button(entry_dict) tk.mainloop()
关键修正说明
- 调整按钮配置:将
login_btn中的object字段改为entry_name,存储输入框在字典中的键名,避免提前引用未初始化的entry_dict。 - 正确绑定按钮命令:使用
lambda表达式延迟函数执行,通过默认参数e=entry_dict[field['entry_name']]固定每个按钮对应的输入框对象,避免循环中变量被覆盖的问题。 - 调整调用顺序:先执行
create_entry()生成输入框字典,再将其传入create_button(),确保按钮能访问到已创建的输入框对象。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

