使用Tkinter Entry输入框写入txt文件无报错但写入失败且消息框显示异常
修复方案
核心问题点
- 变量命名冲突:初始定义的
name、email是StringVar类型,后续创建Entry组件时同名变量被覆盖为组件对象,导致set()方法调用失效,输入值绑定逻辑断裂 - Entry未绑定StringVar:创建输入框时未配置
textvariable参数,StringVar无法同步获取输入内容 - 弹窗模块调用错误:导入时将
tkinter.messagebox别名设为box,实际调用时误用了未定义的messagebox名称 - 空值判断逻辑错误:判断条件直接比对Entry对象与空字符串,永远返回False,错误判断逻辑失效
- 容器未定义:所有组件挂载的
frame4没有提前初始化 - 冗余代码:
with open上下文会自动关闭文件,额外调用close()属于无效操作
修复后完整代码
import tkinter as tk import tkinter.messagebox as box import csv from tkinter import * # 初始化根容器 root = tk.Tk() frame4 = Frame(root) frame4.pack(fill=BOTH, expand=True) # 调整窗口大小适配布局 root.geometry('1000x800') def store_customers(): aname = name_var.get() aemail = email_var.get() aemailaddress = emailaddress_var.get() fullemail = aemail + aemailaddress print(fullemail) # 修正空值判断逻辑,判断输入内容而非组件对象 if aname == "" or aemail == "": print('Error') # 修正弹窗调用别名 box.showerror('错误',"您输入的信息存在问题") email_var.set('') name_var.set('') else: result = box.askquestion('确认', '您即将录入以下信息 \n' + aname + '\n' + fullemail + '\n' ) if result == 'yes': print('写入数据中') with open ('customersdata.txt', 'a', encoding='utf-8', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow([aname, fullemail]) else: name_var.set('') email_var.set('') # 重命名StringVar变量,避免和后续Entry组件重名 name_var = StringVar() email_var = StringVar() emailaddress_var = StringVar() # 给Entry绑定textvariable关联对应的StringVar name_entry = tk.Entry(frame4, textvariable=name_var, bg = '#F0EAD6', font=('Arial',24)) name_entry.place(x= 400, y = 600) email_entry = tk.Entry(frame4, textvariable=email_var, bg = '#F0EAD6', font=('Arial',24)) email_entry.place(x= 400, y = 660) list1 = ['@yahoo.com','@bing.com','@jpc.vic.edu.au', '@gmail.com', '@hotmail.com' ] emailaddres= OptionMenu(frame4, emailaddress_var, *list1) emailaddres.config(height = 2) emailaddress_var.set('@***.***.edu.au') emailaddres.place(x= 685, y= 660) storebtn = tk.Button(frame4, text = '完成', bg= '#F0EAD6', font=('Arial',24), command = store_customers) storebtn.place(x = 430, y= 700) tk.Label(frame4, text= "你的姓名", bg= '#F0EAD6', font=('Arial',24)).place(x = 260, y = 600) tk.Label(frame4, text= "邮箱前缀", bg= '#F0EAD6', font=('Arial',24)).place(x = 240, y = 660) root.mainloop()
效果验证
- 输入姓名、邮箱前缀,选择邮箱后缀后点击完成,会先弹出确认框展示录入的信息,确认后内容会自动写入
customersdata.txt文件 - 姓名或邮箱前缀为空时会弹出错误提示,自动清空输入框内容
内容的提问来源于stack exchange,提问作者SUPER RED PANDA
相关产品推荐
相关产品推荐

