Python tkinter防御游戏注册校验ID重复存db.txt报错咨询
tkinter游戏注册功能修复实现
核心修复逻辑
按照需求调整校验流程,覆盖所有异常场景:
- 点击按钮后先获取输入内容,做空值、长度规则校验,不通过直接终止注册
- 读取
db.txt时兼容文件不存在的首次运行场景,避免文件不存在报错 - 拆分每行存储内容提取已注册ID列表,精确匹配ID重复状态
- 写入文件时统一指定编码,避免跨平台乱码、读取异常
完整可运行代码
import tkinter as tk from tkinter import messagebox import os # 注册规则配置 DB_PATH = "db.txt" ID_MIN_LENGTH = 3 ID_MAX_LENGTH = 16 PWD_MIN_LENGTH = 6 def handle_register(): # 获取输入框内容,自动去除前后空格 input_id = id_entry.get().strip() input_pwd = pwd_entry.get().strip() # 空值校验 if not input_id or not input_pwd: messagebox.showerror("注册失败", "ID和密码不能为空") return # 长度规则校验 if not (ID_MIN_LENGTH <= len(input_id) <= ID_MAX_LENGTH): messagebox.showerror("注册失败", f"ID长度需为{ID_MIN_LENGTH}-{ID_MAX_LENGTH}位") return if len(input_pwd) < PWD_MIN_LENGTH: messagebox.showerror("注册失败", f"密码长度不能少于{PWD_MIN_LENGTH}位") return # 已注册ID校验 registered_ids = set() # 兼容db.txt不存在的首次运行场景 if os.path.exists(DB_PATH): with open(DB_PATH, "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue # 存储格式为 用户名,密码,拆分提取用户名 user_info = line.split(",") if user_info: registered_ids.add(user_info[0]) if input_id in registered_ids: messagebox.showerror("注册失败", "该ID已被注册") return # 校验通过,追加写入db.txt with open(DB_PATH, "a", encoding="utf-8") as f: f.write(f"{input_id},{input_pwd}\n") # 注册成功处理 messagebox.showinfo("注册成功", "账号创建完成") # 清空输入框 id_entry.delete(0, tk.END) pwd_entry.delete(0, tk.END) # 初始化主窗口 root = tk.Tk() root.title("防御类游戏账号注册") root.geometry("320x220") # 表单组件 tk.Label(root, text="账号ID:").pack(pady=10) id_entry = tk.Entry(root) id_entry.pack() tk.Label(root, text="登录密码:").pack(pady=10) pwd_entry = tk.Entry(root, show="*") pwd_entry.pack() # 注册按钮 tk.Button(root, text="join membership", command=handle_register).pack(pady=25) root.mainloop()
常见报错对应修复说明
- 若出现
FileNotFoundError:原代码未处理首次运行时db.txt不存在的场景,新增os.path.exists判断后,文件不存在时直接跳过读取流程,写入时会自动创建文件- 若ID重复判断失效:原代码大概率直接将整行存储内容与输入ID匹配,未做分隔拆分,现通过逗号拆分每行内容精确提取已注册ID,匹配逻辑正确
- 若读写文件出现乱码:原代码未指定文件编码,统一指定
encoding="utf-8"后兼容所有平台- 若点击按钮无反应:原代码可能未调用Entry组件的
get()方法,直接获取了组件对象而非输入的字符串内容,现通过get()方法正确取值
内容的提问来源于stack exchange,提问作者PYTHON
相关产品推荐
相关产品推荐

