Python Tkinter弹窗Entry组件参数返回问题求助
解决Tkinter弹窗Entry值获取的NameError问题
问题根源
你的代码出现NameError有两个核心原因:
- Entry对象创建错误:链式调用
Entry(...).place(...)会返回None,而非Entry实例,所以eKnopf实际是None,即使作用域正确也无法调用get()。 - 作用域问题:
eKnopf是open_popup()的局部变量,take_over_Temp()无法直接访问。
解决方案
方案1:修正Entry创建+使用全局变量
先拆分Entry的创建与布局调用,再通过全局变量暴露Entry实例:
root = Tk() # set up GUI menuleiste = Menu(root) #menu bar def take_over_Temp(): print(eKnopf.get()) print("got it") def open_popup(): global eKnopf # 声明全局变量 top= Toplevel(root) top.geometry("750x250") top.title("Child Window") # 拆分Entry创建和place调用,确保eKnopf是Entry实例 eKnopf = Entry(top, bd = 5) eKnopf.place(x=10,y=100, width=100) button_take_Temp = Button(top, text='Set Temperature', fg="red", command=take_over_Temp) button_take_Temp.place(x=10, y=150, width=100) optionen_menu.add_command(label="Offset", command = open_popup)
方案2:使用Lambda传递参数(推荐,避免全局变量)
通过Lambda将Entry实例直接传递给回调函数,无需全局变量:
root = Tk() # set up GUI menuleiste = Menu(root) #menu bar # 修改函数,接收Entry实例作为参数 def take_over_Temp(entry_widget): print(entry_widget.get()) print("got it") def open_popup(): top= Toplevel(root) top.geometry("750x250") top.title("Child Window") eKnopf = Entry(top, bd = 5) eKnopf.place(x=10,y=100, width=100) # 用Lambda包装命令,传递Entry实例 button_take_Temp = Button(top, text='Set Temperature', fg="red", command=lambda: take_over_Temp(eKnopf)) button_take_Temp.place(x=10, y=150, width=100) optionen_menu.add_command(label="Offset", command = open_popup)
关键说明
- 所有Tkinter布局方法(
place()/pack()/grid())都返回None,必须拆分创建和布局代码才能获取控件实例。 - 全局变量虽然简单,但会增加代码耦合度,优先使用Lambda传递参数的方式。
内容的提问来源于stack exchange,提问作者Paulina F
相关产品推荐
相关产品推荐

