从Tkinter主程序调用登录/注册子窗口时的启动异常问题
解决Tkinter登录/注册程序的窗口触发异常问题
问题现象
开发基于Tkinter的登录/注册GUI程序时,遇到两个异常:
- 运行home.py时,注册窗口会直接启动,无需点击按钮触发
- 所有窗口出现叠加显示的问题
问题根源
- register.py自动执行函数:register.py文件末尾直接调用了
register(),导致导入该模块时函数立即执行,弹出注册窗口。 - 按钮命令绑定错误:home.py中按钮的
command参数使用了register()和login(),这会在创建按钮时直接调用函数,而非绑定点击触发的函数引用。 - 多主窗口冲突:login()和register()中都使用
Tk()创建新的主窗口,而Tkinter应用应仅存在一个主窗口,多个主窗口会导致循环冲突和窗口叠加。
修复方案
- 移除register.py中的自动调用代码
- 修正home.py中按钮的命令绑定方式
- 将登录/注册窗口改为主窗口的子窗口(使用
Toplevel()),并移除子窗口的主循环
修改后的login.py
from tkinter import * from tkinter import messagebox from functions import * def login(): # 创建子窗口,而非新主窗口 root = Toplevel() root.geometry("200x200+750+400") root.title("登录") # 添加用户名参数 username_var = StringVar() username_entry = Entry(root, textvariable=username_var).grid(row=0, column=1) username_label = Label(root, text="用户名").grid(row=0, column=0) # 添加密码参数(增加密码隐藏) password_var = StringVar() password_entry = Entry(root, textvariable=password_var, show="*").grid(row=1, column=1) password_label = Label(root, text="密码").grid(row=1, column=0) temp_list = [] def get_values_and_check(value, value2): x = value.get() y = value2.get() temp_list.append(x) temp_list.append(y) def correct_user_and_password(): data = only_read_csv("user_info") for row in data: if row[0] == x and row[1] == y: return True return False auth_bool = correct_user_and_password() if auth_bool: messagebox.showinfo("登录成功", "您已成功登录") root.destroy() # 登录成功后关闭窗口 return True else: messagebox.showwarning("登录失败", "用户名或密码错误") return False data_button = Button(root, text="确认", command=lambda: get_values_and_check(username_var, password_var)).grid(row=2, column=1)
修改后的register.py
from functions import * from tkinter import * from tkinter import messagebox def register(): # 创建子窗口 root = Toplevel() root.geometry("300x200+750+400") root.title("注册") # 用户参数 username_var = StringVar() username_entry = Entry(root, textvariable=username_var).grid(row=0, column=1) username_label = Label(root, text="用户名").grid(row=0, column=0) # 密码参数(增加密码隐藏) password_var = StringVar() password_entry = Entry(root, textvariable=password_var, show="*").grid(row=1, column=1) password_label = Label(root, text="密码").grid(row=1, column=0) password_again_var = StringVar() password_again_entry = Entry(root, textvariable=password_again_var, show="*").grid(row=2, column=1) password_again_label = Label(root, text="再次输入密码").grid(row=2, column=0) def authenticate(value, value2, value3): x = value.get() y = value2.get() z = value3.get() temp_data = [x, y] if y == z: appendrow_csv("user_info", temp_data) messagebox.showinfo("成功", "您的账户已创建成功") root.destroy() # 注册成功后关闭窗口 return True else: messagebox.showerror("错误", "两次输入的密码不一致") return False verify_button = Button(root, text="确认", command=lambda: authenticate(username_var, password_var, password_again_var)).grid(row=3, column=0) # 移除自动调用的register()
修改后的home.py
from tkinter import * from login import login from register import register # 唯一主窗口 root = Tk() root.geometry("200x200+750+400") root.title("首页") # 按钮命令绑定函数引用,而非直接调用 register_button = Button(root, text="注册", command=register).grid(row=0, column=0, padx=10, pady=50) login_button = Button(root, text="登录", command=login).grid(row=0, column=1, padx=10, pady=50) root.mainloop()
内容的提问来源于stack exchange,提问作者Aum Pandya
相关产品推荐
相关产品推荐

