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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:07:18