Tkinter注册功能异常:输入内容无法写入accountfile.txt
问题描述
我是编程和Stack Overflow的新手,正在用Tkinter开发一个学校项目的游戏。目前遇到的问题是:注册模块中,regUser和regPass的输入值无法写入accountfile.txt文件。最初写入的是PYVAR0和PYVAR1,查阅资料后改用.get()方法,但现在仅能写入空格和换行符,regUser和regPass的实际内容依然为空。
当前问题仅涉及register()函数,login()函数将后续处理。如果有人能指出后续验证输入的用户名和密码与文件中保存内容时可能遇到的问题,或提供相关实现建议,我将十分感激,但目前优先解决当前的写入问题。
问题代码
from tkinter import * from tkinter import ttk import tkinter as tk def welcomeScreen(): welcomeScreen = tk.Tk() welcomeScreen.title("Welcome") welcomeScreen.geometry("300x300") choice = tk.Label(text="Welcome to Investor, please log in or register an account") choice.pack() loginButton1 = tk.Button(welcomeScreen, text="Log in", command=lambda: [login(), welcomeScreen.destroy()]) loginButton1.pack() regButton1 = tk.Button(welcomeScreen, text="Register", command=lambda: [register(), welcomeScreen.destroy()]) regButton1.pack() welcomeScreen.mainloop() def login(): global username; tk.StringVar() global password; tk.StringVar() loginScreen = tk.Tk() loginScreen.geometry("400x300") loginScreen.title("Log in to your account") login1 = tk.Label(loginScreen, text="Please log in to your account") login1.pack() signIn = ttk.Frame(loginScreen) signIn.pack() lbl_username = ttk.Label(signIn, text="Username:") lbl_username.pack(fill='x', expand=True) entry_username = Entry(signIn, textvariable=username) entry_username.pack(fill='x', expand=True) entry_username.focus() lbl_password = ttk.Label(signIn, text="Password:") lbl_password.pack(fill='x', expand=True) entry_password = ttk.Entry(signIn, textvariable=password, show="*") entry_password.pack(fill='x', expand=True) btn_login = Button(signIn, text="Login", command=login) btn_login.pack() btn_back1 = Button(signIn, text="Back", command=lambda: [loginScreen.destroy(), welcomeScreen()]) btn_back1.pack() def register(): global regUser regUser=tk.StringVar() global regPass regPass=tk.StringVar() regScreen = tk.Tk() regScreen.geometry("400x300") regScreen.title("register") register1 = tk.Label(regScreen, text="Please create a account") register1.pack() register = ttk.Frame(regScreen) register.pack() lbl_createName = ttk.Label(register, text="Create an username:") lbl_createName.pack(fill='x', expand=True) entry_createName = Entry(register, textvariable=regUser) entry_createName.pack(fill='x', expand=True) entry_createName.focus() lbl_createPass = ttk.Label(register, text="Create an password:") lbl_createPass.pack(fill='x', expand=True) entry_createPass = ttk.Entry(register, textvariable=regPass) entry_createPass.pack(fill='x', expand=True) btn_reg = Button (register, text='Register', command=createUser) btn_reg.pack() btn_back2= Button(register, text="Back", command=lambda: [regScreen.destroy(), welcomeScreen()]) btn_back2.pack() def createUser(): file = open("accountfile.txt","a") file.write(str(regUser.get())) file.write(" ") file.write(str(regPass.get())) file.write(" ") file.close() welcomeScreen()
解决方案
核心问题修复(写入空内容)
替换
tk.Tk()为tk.Toplevel()
在register()和login()函数中,创建新的tk.Tk()实例会导致多个主窗口共存,破坏StringVar与输入框的绑定关系。改用tk.Toplevel()创建子窗口:# register函数中修改 regScreen = tk.Toplevel() # login函数中修改 loginScreen = tk.Toplevel()修复换行符错误
createUser()函数中的换行符写法无效,将" "改为"\n":file.write("\n")
优化建议(可选)
- 避免全局变量:可以将
regUser和regPass作为参数传递给createUser(),或者用类封装注册窗口逻辑,减少全局变量使用,提升代码可维护性。 - 文件操作优化:使用
with语句自动管理文件关闭,避免资源泄漏:def createUser(): with open("accountfile.txt","a") as file: file.write(f"{regUser.get()} {regPass.get()}\n")
后续登录验证注意事项
- 文件读取格式:保存的用户名和密码以空格分隔,读取时需按行分割后拆分字段,注意处理空行或格式错误的行。
- 密码安全性:不要明文存储密码,学校项目可使用
hashlib对密码进行简单加密后再存储。 - 输入验证:注册时检查用户名是否重复、密码长度是否合规;登录时处理文件不存在的情况,避免抛出异常。
内容的提问来源于stack exchange,提问作者spxrk_17
相关产品推荐
相关产品推荐

