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

Tkinter登录按钮无响应,需实现验证后跳转至Vote_Page

Tkinter登录功能修复及Vote页面实现

问题背景

现有Tkinter+SQLite的注册登录程序,已实现“Login here”文本点击跳转登录页,但输入正确用户名密码后点击Login按钮无响应。需要完成:

  • 修复登录按钮无反应问题
  • 登录验证通过后跳转至Vote_Page,该页面需提供查找用户、修改密码、删除账号操作选项

问题排查

  1. 登录页的Entry组件未指定父窗口new_win,导致无法正确获取输入内容
  2. 登录验证逻辑仅简单对比返回值,需确保KullaniciAra函数返回对应用户的密码(用户不存在则返回None)

修复后完整代码

from tkinter import *
from database import *

def Control_():
    var1 = NameE.get()
    var2 = LastnameE.get()
    var3 = UsernameE.get()
    var4 = PasswordE.get()
    search = KullaniciAra(var3)
    if search is None:
        kullanici_ekle(var1, var2, var3, var4)
        Login_Page()
    else:
        # 避免重复创建标签,先销毁已有错误标签
        for widget in win.grid_slaves(row=8, column=1):
            widget.destroy()
        ErrorLabel = Label(win, text="This username is taken.")
        ErrorLabel.grid(row=8, column=1)

def Vote_Page(current_user):
    def find_user():
        # 查找用户功能实现示例
        target_user = user_search_entry.get()
        result = KullaniciAra(target_user)
        if result:
            result_label.config(text=f"用户 {target_user} 存在")
        else:
            result_label.config(text=f"用户 {target_user} 不存在")

    def change_password():
        # 修改密码功能实现示例
        new_pwd = new_pwd_entry.get()
        if new_pwd:
            # 假设database.py中有修改密码的函数
            sifre_guncelle(current_user, new_pwd)
            result_label.config(text="密码修改成功")
        else:
            result_label.config(text="请输入新密码")

    def delete_account():
        # 删除账号功能实现示例
        # 假设database.py中有删除用户的函数
        kullanici_sil(current_user)
        vote_win.destroy()
        Login_Page()

    vote_win = Tk()
    vote_win.title("Vote Page")
    vote_win.geometry("300x250")

    # 查找用户模块
    user_search_label = Label(vote_win, text="查找用户名:")
    user_search_label.grid(row=0, column=0, padx=5, pady=10)
    user_search_entry = Entry(vote_win)
    user_search_entry.grid(row=0, column=1, padx=5, pady=10)
    search_btn = Button(vote_win, text="查找", command=find_user)
    search_btn.grid(row=0, column=2, padx=5, pady=10)

    # 修改密码模块
    new_pwd_label = Label(vote_win, text="新密码:")
    new_pwd_label.grid(row=1, column=0, padx=5, pady=10)
    new_pwd_entry = Entry(vote_win, show="*")
    new_pwd_entry.grid(row=1, column=1, padx=5, pady=10)
    change_pwd_btn = Button(vote_win, text="修改密码", command=change_password)
    change_pwd_btn.grid(row=1, column=2, padx=5, pady=10)

    # 删除账号按钮
    delete_btn = Button(vote_win, text="删除账号", fg="red", command=delete_account)
    delete_btn.grid(row=2, column=1, pady=15)

    # 结果提示标签
    result_label = Label(vote_win, text="", fg="green")
    result_label.grid(row=3, column=0, columnspan=3)

    vote_win.mainloop()

def Login_Page():
    def on_login():
        username = UsernameE2.get()
        password = PasswordE2.get()
        # 假设KullaniciAra返回对应用户的密码,不存在则返回None
        stored_pwd = KullaniciAra(username)
        if stored_pwd == password and stored_pwd is not None:
            new_win.destroy()
            Vote_Page(username)
        else:
            # 显示登录错误提示
            error_label.config(text="用户名或密码错误")

    # 销毁原注册窗口
    win.destroy()

    new_win = Tk()
    new_win.title("T Messenger L")
    new_win.geometry("200x220")

    UsernameL2 = Label(new_win, text="Username", fg="black", bg="lightgray")
    UsernameL2.grid(row=0, column=0, padx=5, pady=5)
    # 绑定Entry到new_win窗口
    UsernameE2 = Entry(new_win)
    UsernameE2.grid(row=0, column=1, padx=5, pady=5)

    PasswordL2 = Label(new_win, text="Password", fg="black", bg="lightgray")
    PasswordL2.grid(row=1, column=0, padx=5, pady=5)
    PasswordE2 = Entry(new_win, show="*")
    PasswordE2.grid(row=1, column=1, padx=5, pady=5)

    Button2 = Button(new_win, text="Login", command=on_login)
    Button2.grid(row=2, column=1, pady=10)

    # 登录错误提示标签
    error_label = Label(new_win, text="", fg="red")
    error_label.grid(row=3, column=0, columnspan=2)

    new_win.mainloop()

# 初始化数据库表
Tablo_olustur()

# 注册窗口
win = Tk()
win.title("T Messenger R")
win.geometry("200x220")

NameL = Label(win, text="Name", fg="black", bg="lightgray")
NameL.grid(row=1, column=0, padx=5, pady=5)
NameE = Entry(win)
NameE.grid(row=1, column=1, padx=5, pady=5)

LastnameL = Label(win, text="Lastname", fg="black", bg="lightgray")
LastnameL.grid(row=2, column=0, padx=5, pady=5)
LastnameE = Entry(win)
LastnameE.grid(row=2, column=1, padx=5, pady=5)

UsernameL = Label(win, text="Username", fg="black", bg="lightgray")
UsernameL.grid(row=3, column=0, padx=5, pady=5)
UsernameE = Entry(win)
UsernameE.grid(row=3, column=1, padx=5, pady=5)

PasswordL = Label(win, text="Password", fg="black", bg="lightgray")
PasswordL.grid(row=4, column=0, padx=5, pady=5)
PasswordE = Entry(win, show="*")
PasswordE.grid(row=4, column=1, padx=5, pady=5)

theLabel = Label(win, text="Login here", fg="blue", cursor="hand2", font=("TkDefaultFont",12,"underline"))
theLabel.grid(row=5, column=1, pady=5)
theLabel.bind("<Button-1>", lambda event: Login_Page())

Button1 = Button(win, text="Register", command=Control_)
Button1.grid(row=6, column=1, pady=10)

win.mainloop()

关键改动说明

  • 修复登录输入获取问题:给登录页的Entry组件指定父窗口new_win,确保能正确读取用户输入
  • 完善登录验证逻辑:验证用户名对应的存储密码与输入密码是否匹配,同时排除用户不存在的情况
  • 新增Vote_Page页面:实现查找用户、修改密码、删除账号的功能框架,需配合database.py中对应的函数(如sifre_guncelle、kullanici_sil)完成数据库操作
  • 优化提示逻辑:添加错误提示标签,避免重复创建标签导致的界面混乱
  • 密码输入隐藏:给密码输入框添加show="*"参数,提升安全性

内容的提问来源于stack exchange,提问作者xDevsMC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:13:36