Tkinter Entry组件报错:'NoneType'对象无'get'属性,无法获取值
解决Tkinter中Entry.get()触发AttributeError的问题
你遇到的AttributeError: 'NoneType' object has no attribute 'get'是两个典型Tkinter错误导致的,下面直接说问题根源和修复方案:
错误原因
1. 链式调用布局方法导致变量指向None
Tkinter的place()、pack()、grid()这类几何管理方法返回的都是None。你写的e_name = tk.Entry(...).place(...)会把None赋值给e_name,后续调用e_name.get()自然会触发NoneType错误。必须把组件创建和布局代码分开写。
2. textvariable参数使用未初始化变量
你给Entry的textvariable传了e_name这类还没定义的变量,这会引发运行时错误。如果不需要双向绑定功能,直接去掉这个参数即可;如果需要绑定,要提前创建tk.StringVar()对象。
修复后的关键代码
正确创建Entry组件
# Name输入框 tk.Label(frame2, text="Name: ", bg=bg_colour, fg="white", font=("font_reg", 10)).place(x=350, y=120) e_name = tk.Entry(frame2, bg="#d6d7ed") e_name.place(x=430, y=120) # Email输入框 tk.Label(frame2, text="Email: ", bg=bg_colour, fg="white", font=("font_reg", 10)).place(x=350, y=150) e_email = tk.Entry(frame2, bg="#d6d7ed") e_email.place(x=430, y=150) # Age输入框 tk.Label(frame2, text="Age: ", bg=bg_colour, fg="white", font=("font_reg", 10)).place(x=350, y=180) e_age = tk.Entry(frame2, bg="#d6d7ed") e_age.place(x=430, y=180) # City输入框 tk.Label(frame2, text="City: ", bg=bg_colour, fg="white", font=("font_reg", 10)).place(x=350, y=210) e_city = tk.Entry(frame2, bg="#d6d7ed") e_city.place(x=430, y=210) # Phone输入框 tk.Label(frame2, text="Phone No.: ", bg=bg_colour, fg="white", font=("font_reg", 10)).place(x=350, y=240) e_num = tk.Entry(frame2, bg="#d6d7ed") e_num.place(x=430, y=240)
优化保存函数(包含用户信息写入)
def save_app(): answer = messagebox.askquestion(title='Checking...', message='Are you sure with your chosen date and time?') if answer == 'yes': check_date = cal.get_date() convert_datetime = datetime.strptime(check_date, '%m/%d/%y') # 检查是否为工作日 if convert_datetime.weekday() in (5,6): messagebox.showerror(title='Error!', message='We only work on weekdays! Kindly select a date accordingly.') return # 获取所有输入值并验证非空 name = e_name.get().strip() email = e_email.get().strip() age = e_age.get().strip() city = e_city.get().strip() phone = e_num.get().strip() if not all([name, email, age, city, phone]): messagebox.showerror(title='Error!', message='Please fill in all fields!') return selected_time = cb_time.get() selected_date = check_date # 写入文件(包含完整用户信息) with open("saved app.txt",'a', encoding='utf-8') as f: f.write(f"--- New Appointment ---\n") f.write(f"Name: {name}\n") f.write(f"Email: {email}\n") f.write(f"Age: {age}\n") f.write(f"City: {city}\n") f.write(f"Phone: {phone}\n") f.write(f"Date: {selected_date}\n") f.write(f"Time: {selected_time}\n\n") messagebox.showinfo("Saved", "Appointment saved successfully!") else: messagebox.showinfo(title='Try again', message='Choose your appointment wisely!')
优化打印函数(更清晰的展示)
def print_app(): # 用Toplevel代替Tk(),避免创建多个主窗口 p = tk.Toplevel() p.geometry('400x500') p.title('Print Appointment') p.resizable(False, False) tk.Label(p, text="Kindly Screenshot this information.", font=("font_reg", 10)).pack(pady=10) try: with open("saved app.txt", "r", encoding='utf-8') as r: results = r.read() # 用Text组件显示,支持换行和只读 text_widget = tk.Text(p, wrap=tk.WORD, width=45, height=25) text_widget.pack(pady=10) text_widget.insert(tk.END, results) text_widget.config(state=tk.DISABLED) except FileNotFoundError: tk.Label(p, text="No appointments saved yet!", font=("font_reg", 12)).pack(pady=20)
其他小优化
- 去掉了
save_app里多余的while True循环,直接用条件判断返回更简洁 - 打印窗口改用
tk.Toplevel(),避免同时存在多个Tk主窗口导致的异常
内容的提问来源于stack exchange,提问作者Erica Miles
相关产品推荐
相关产品推荐

