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

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()
问题原因
  1. CSV读取逻辑错误:csv.reader(file)返回的是行迭代器,每一行数据是一个列表(例如["test_user", "123456"])。直接用user_entry in csv.reader(file)是判断输入的字符串是否等于某一整行的列表,永远不会匹配,导致检测失效。
  2. 执行逻辑顺序问题:按钮的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:31:11