使用Python Tkinter开发问答游戏时,无法从Entry获取玩家名称
解决Tkinter Entry组件获取玩家名称的问题
问题分析
你遇到的两个问题核心都是对Tkinter Entry组件的get()方法使用时机和方式理解有误:
问题1:直接添加Entry对象到列表
直接把player1、player2这些Entry对象加入列表,打印的自然是组件实例而非用户输入的文本——因为你存储的是组件本身,不是用户输入的内容。
问题2:提前调用get()导致空字符串
你在创建Entry后立即执行player1.get(还遗漏了方法调用的括号),此时用户还未输入任何内容,因此拿到的是空值;同时你赋值的是方法本身,不是调用方法后得到的输入结果。
正确解决方案
核心逻辑是在用户点击保存按钮时,再调用Entry的get()方法获取实时输入内容,而非提前获取或存储组件对象。
修改后的完整代码如下:
import tkinter as tk WIDTH = 1600 HEIGHT = 800 names = [] win = tk.Tk() win.title('game') win.geometry(f"{WIDTH}x{HEIGHT}") win.attributes('-fullscreen', True) def settings(): def save(): # 点击保存时才获取输入框的实时内容 player1_name = player1.get() player2_name = player2.get() # 清空原有列表并添加新名称 names.clear() names.append(player1_name) names.append(player2_name) print(names) # 按需销毁组件,可根据业务逻辑调整 for widget in win.winfo_children(): widget.destroy() # 重命名变量避免与函数名冲突 settings_frame = tk.Frame(win, width=WIDTH, height=HEIGHT) settings_frame.pack() name_lab = tk.Label(settings_frame, font=('arial', 20), text='Choose your names') name_lab.grid(row=0, column=1) player1_lab = tk.Label(settings_frame, font='arial', text='Input name of player 1:') player1_lab.grid(row=2, column=0) player1 = tk.Entry(settings_frame, font='arial') player1.grid(row=3, column=0) player2_lab = tk.Label(settings_frame, font='arial', text='Input name of player 2:') player2_lab.grid(row=2, column=2) player2 = tk.Entry(settings_frame, font='arial') player2.grid(row=3, column=2) name_save = tk.Button(settings_frame, font='arial', text='Save', command=save) name_save.grid(row=4, column=1) settings() win.mainloop()
关键修正点
- 将
get()方法的调用时机移到save()函数内部,确保获取的是用户点击保存时的最新输入 - 修正拼写错误:
Imput改为Input,Choose you names改为Choose your names - 重命名原
settings变量为settings_frame,避免与外层函数名冲突 - 使用f-string简化窗口尺寸的字符串拼接逻辑
内容的提问来源于stack exchange,提问作者CaptainAlpacaus
相关产品推荐
相关产品推荐

