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

Python Tkinter弹窗Entry组件参数返回问题求助

解决Tkinter弹窗Entry值获取的NameError问题

问题根源

你的代码出现NameError有两个核心原因:

  1. Entry对象创建错误:链式调用Entry(...).place(...)会返回None,而非Entry实例,所以eKnopf实际是None,即使作用域正确也无法调用get()。
  2. 作用域问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:33:49