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

使用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()

效果验证

  1. 输入姓名、邮箱前缀,选择邮箱后缀后点击完成,会先弹出确认框展示录入的信息,确认后内容会自动写入customersdata.txt文件
  2. 姓名或邮箱前缀为空时会弹出错误提示,自动清空输入框内容

内容的提问来源于stack exchange,提问作者SUPER RED PANDA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:36:02