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

Tkinter Entry组件调用get()方法报错,请求问题排查与解决

Tkinter按钮获取输入框内容报错的问题分析与解决

问题原因

  • Entry变量赋值错误:nameEntry = ttk.Entry(...).place(...)这种链式写法会让nameEntry等于place()方法的返回值None,而非Entry对象。后续调用nameEntry.get()时,就会触发AttributeError: 'NoneType' object has no attribute 'get'。
  • 按钮command参数误用:command=queryInsert(nameEntry.get())会在创建按钮时立即执行queryInsert函数,而非点击按钮时触发。同时因为nameEntry是None,这一步直接抛出错误。

解决方法

1. 修正Entry对象的创建方式

将Entry的创建和布局操作拆分,先创建Entry对象再调用布局方法:

nameEntry = ttk.Entry(root, textvariable=namePerson)
nameEntry.place(x=60, y=20)

2. 修正按钮的command绑定逻辑

使用lambda表达式延迟函数调用,确保只有点击按钮时才执行queryInsert并传入输入框内容:

Button(root, text="Initialize DB", command=lambda: queryInsert(nameEntry.get()), width=15).place(x=100, y=200)

另外,也可以直接利用绑定的StringVar来获取值,无需操作Entry对象:

# 修改函数
def queryInsert(name_var):
    print(name_var.get())

# 按钮绑定
Button(root, text="Initialize DB", command=lambda: queryInsert(namePerson), width=15).place(x=100, y=200)

完整修正代码

from tkinter import *
from tkinter import ttk

def queryInsert(name_value):
    print(name_value)

def main():
    root = Tk()
    root.title("Personal Network - Add Person")
    root.geometry('400x270')
    root.resizable(False, False)

    Label(root, text='Name').place(x=20,y=20)
    Label(root, text='Surname').place(x=20, y=50)
    Label(root, text='Birthday').place(x=20, y=75)
    Label(root, text='Phone').place(x=20, y=100)
    Label(root, text='Adress').place(x=20, y=125)
    Label(root, text='City').place(x=20, y=150)

    namePerson = StringVar()
    nameEntry = ttk.Entry(root, textvariable=namePerson)
    nameEntry.place(x=60, y=20)
    Button(root, text="Initialize DB", command=lambda: queryInsert(nameEntry.get()), width=15).place(x=100, y=200)

    root.mainloop()

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Federico Calò

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:47:06