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ò
相关产品推荐
相关产品推荐

