Python Tkinter登录系统:如何检查用户名是否存在于TXT文件中
问题描述
使用Tkinter开发登录系统时,需要检查用户输入的用户名是否存在于userdata2.txt文件中,若存在则显示错误提示。尝试通过lambda将user_entry.get()传入checkinfo函数,但该函数无法正确检测用户名是否已存在,导致重复添加用户名。相关代码如下:
button1 = Button(topwindow, text='Submit', command=lambda: [checkinfo(user_entry.get()), saveinfo(user_entry.get(), password_entry.get()), displaymessage1()])
def checkinfo(user_entry): with open('userdata2.txt') as file: if user_entry in csv.reader(file): print("Username already taken. Please chose a different username.") else: pass def signup(): topwindow = Toplevel() topwindow.geometry("400x400") label1 = Label(topwindow, text='Please select username and password.', font=('Arial', 19)) label1.pack() label2 = Label(topwindow, text="Select a username.") label2.pack() user_entry = Entry(topwindow) user_entry.pack() label3 = Label(topwindow, text="Select a password.") label3.pack() password_entry = Entry(topwindow) password_entry.pack() button1 = Button(topwindow, text='Submit', command=lambda: [checkinfo(user_entry.get()), saveinfo(user_entry.get(), password_entry.get()), displaymessage1()]) button1.pack()
问题原因
- CSV读取逻辑错误:
csv.reader(file)返回的是行迭代器,每一行数据是一个列表(例如["test_user", "123456"])。直接用user_entry in csv.reader(file)是判断输入的字符串是否等于某一整行的列表,永远不会匹配,导致检测失效。 - 执行逻辑顺序问题:按钮的command中三个函数是按顺序执行的,不管
checkinfo的检测结果,就算用户名已存在,saveinfo仍会执行,最终导致重复添加。
修复代码
import csv from tkinter import Tk, Toplevel, Button, Label, Entry def checkinfo(username): # 遍历CSV文件,提取每行的用户名进行对比 with open('userdata2.txt', 'r') as file: reader = csv.reader(file) for row in reader: if row and row[0] == username: # 确保行不为空,取第一个元素(用户名) return True return False def saveinfo(username, password): with open('userdata2.txt', 'a', newline='') as file: writer = csv.writer(file) writer.writerow([username, password]) def displaymessage1(): # 这里可以添加注册成功的提示逻辑 print("Registration successful!") def signup(): topwindow = Toplevel() topwindow.geometry("400x400") label1 = Label(topwindow, text='Please select username and password.', font=('Arial', 19)) label1.pack() label2 = Label(topwindow, text="Select a username.") label2.pack() user_entry = Entry(topwindow) user_entry.pack() label3 = Label(topwindow, text="Select a password.") label3.pack() password_entry = Entry(topwindow, show='*') # 密码框隐藏输入 password_entry.pack() # 修改按钮逻辑:先检查用户名,不存在才执行保存和提示 def on_submit(): username = user_entry.get().strip() password = password_entry.get().strip() if not username or not password: print("Username and password cannot be empty!") return if checkinfo(username): print("Username already taken. Please choose a different username.") else: saveinfo(username, password) displaymessage1() topwindow.destroy() # 注册成功后关闭窗口 button1 = Button(topwindow, text='Submit', command=on_submit) button1.pack() # 主窗口示例 root = Tk() root.withdraw() # 隐藏主窗口,直接显示注册窗口 signup() root.mainloop()
关键修改说明
checkinfo函数改为返回布尔值,遍历CSV的每一行,提取第一个元素(用户名)与输入值对比。- 将按钮的command改为单独的
on_submit函数,先验证输入合法性,再检查用户名是否存在,只有通过检测才执行保存和提示操作。 - 给密码输入框添加
show='*',符合密码输入的常规逻辑,同时增加了空输入的校验。
内容的提问来源于stack exchange,提问作者pc510895
相关产品推荐
相关产品推荐

