Python Tkinter获取Entry输入值校验Users.txt重复登录名及报错修复
问题说明
先明确两个认知误区:
io.UnsupportedOperation: not readable报错和tk.StringVar没有任何关系- 绑定到Entry的
StringVar调用.get()方法,返回的就是标准Python字符串,完全可以直接用于字符串匹配逻辑,不存在类型导致的文件读取问题。
报错的真实原因:你实际运行的代码打开C://Users.txt时,没有使用只读模式'r',大概率误用了'w'(覆盖写入)、'a'(追加写入)这类只写模式,对只写模式的文件对象调用readlines()就会触发该报错。另外你贴的示例代码存在基础语法错误:多句代码挤在同一行、变量名data file包含非法空格,也会导致运行异常。
正确实现方案
- 获取输入值:直接调用
email.get().strip()即可拿到用户输入的普通字符串,.strip()用于自动去除输入首尾的空格、换行符,避免无效字符影响校验结果。 - 文件读取规范:使用
with上下文管理器操作文件,自动处理文件打开、关闭逻辑,避免文件句柄占用问题;打开文件明确指定'r'只读模式和文件编码,避免乱码。 - 校验逻辑优化:不要用
in做模糊匹配,否则会出现“已有账号test123时,输入test也判定为已存在”的逻辑错误,应该对每行内容去换行后做精确匹配。
参考实现代码
import tkinter as tk from tkinter import ttk, messagebox def check_account_exist(): input_account = email.get().strip() if not input_account: messagebox.showwarning("提示", "请输入登录账号") return False try: # 以只读模式打开文件,指定utf-8编码适配中文内容 with open('C:/Users.txt', 'r', encoding='utf-8') as f: for line in f: exist_account = line.strip() # 精确匹配账号 if exist_account == input_account: messagebox.showwarning("警告", "账号已被占用") return True return False except Exception as e: messagebox.showerror("错误", f"读取账号文件失败:{str(e)}") return False # 测试界面 root = tk.Tk() sign_in = ttk.Frame(root, padding=20) sign_in.pack() email = tk.StringVar() ttk.Label(sign_in, text="登录账号:").grid(row=0, column=0, padx=5, pady=5) email_entry = ttk.Entry(sign_in, textvariable=email) email_entry.grid(row=0, column=1, padx=5, pady=5) ttk.Button(sign_in, text="提交校验", command=check_account_exist).grid(row=1, columnspan=2, pady=10) root.mainloop()
注意事项
- Python代码不要把多条独立语句挤在同一行,很容易触发解析错误,不同语句建议换行书写。
- Windows系统下的文件路径用单斜杠
/即可正常识别,不需要写双斜杠。 - 如果之前用写模式打开过
Users.txt没有关闭,建议先重启Python解释器释放文件句柄,再运行代码。
内容的提问来源于stack exchange,提问作者Hashimdev
相关产品推荐
相关产品推荐

