基于Python+MySQL的Tkinter注册登录门户无报错但窗口不弹出
问题分析与修复
核心问题
程序运行无报错但Tkinter窗口不弹出,是因为主窗口的创建代码被错误嵌套在submit_login函数内部,而这个函数从未被调用,导致程序启动后没有任何代码触发主窗口的创建与事件循环。除此之外,代码还存在变量作用域错误、数据库游标未初始化、按钮创建位置错误等问题,都会导致功能失效。
修复后的完整代码
import tkinter as tk import mysql.connector from tkinter import messagebox # 连接数据库并初始化游标 mysqldb = mysql.connector.connect( host='localhost', user='root', password='', database='lab4registrationlogindata' ) mycursor = mysqldb.cursor() # 新增:初始化数据库游标 # 用户注册功能 def register(): # 创建注册窗口 reg_window = tk.Toplevel() reg_window.title("Registration Portal") # 创建用户名输入框 tk.Label(reg_window, text="Username :").grid(row=0, column=0) username_entry = tk.Entry(reg_window) username_entry.grid(row=0, column=1) # 创建密码输入框 tk.Label(reg_window, text="Password :").grid(row=1, column=0) password_entry = tk.Entry(reg_window, show="*") password_entry.grid(row=1, column=1) # 嵌套定义提交注册函数,直接访问当前函数内的局部变量 def submit_registration(): username = username_entry.get() password = password_entry.get() # 插入数据到数据库 sql = "INSERT INTO users (username, password) VALUES (%s, %s)" values = (username, password) mycursor.execute(sql, values) mysqldb.commit() messagebox.showinfo("Success", "Registration successful!") reg_window.destroy() # 创建提交按钮(放在register函数内,窗口创建时就显示) submit_button = tk.Button(reg_window, text="Register", bg="light blue", command=submit_registration) submit_button.grid(row=2, column=1) # 用户登录功能 def login(): # 创建登录窗口 login_window = tk.Toplevel() login_window.title("Login Portal") # 创建用户名输入框 tk.Label(login_window, text="Username:").grid(row=0, column=0) username_entry = tk.Entry(login_window) username_entry.grid(row=0, column=1) # 创建密码输入框 tk.Label(login_window, text="Password").grid(row=1, column=0) password_entry = tk.Entry(login_window, show="*") password_entry.grid(row=1, column=1) # 嵌套定义提交登录函数,直接访问当前函数内的局部变量 def submit_login(): username = username_entry.get() password = password_entry.get() sql = "SELECT * FROM users WHERE username = %s AND password = %s" values = (username, password) mycursor.execute(sql, values) result = mycursor.fetchone() if result: messagebox.showinfo("Welcome", f"Welcome, {username}") login_window.destroy() else: messagebox.showerror("Login", "Invalid username or password") # 创建登录按钮(放在login函数内,窗口创建时就显示) submit_button = tk.Button(login_window, text="Login", command=submit_login, bg="light blue") submit_button.grid(row=2, column=1) # 主窗口创建(放在全局作用域,程序启动即执行) root = tk.Tk() root.title("Main Portal") tk.Label(root, text="Welcome to Main Portal", bg="grey", font="Arial 14").pack() # 注册、登录按钮 register_button = tk.Button(root, text="Register", bg="light blue", command=register) register_button.pack(pady=10) login_button = tk.Button(root, text="Login", bg="light blue", command=login) login_button.pack() root.mainloop()
关键修改说明
- 主窗口代码移至全局作用域:将原
submit_login函数内的主窗口创建代码移出,放在程序最后,确保程序启动后立即创建主窗口并进入Tkinter事件循环。 - 初始化数据库游标:新增
mycursor = mysqldb.cursor(),否则无法执行数据库的增查操作。 - 修复变量作用域:将
submit_registration和submit_login函数分别嵌套在register和login函数内部,这样内部函数可以直接访问外部函数的局部变量(如输入框、窗口对象),避免全局变量污染。 - 调整按钮创建位置:将注册、登录的提交按钮创建代码移至对应窗口的创建函数内,确保窗口显示时按钮已经存在,用户可以正常点击提交。
内容的提问来源于stack exchange,提问作者yasminsyamn
相关产品推荐
相关产品推荐

