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

基于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()

关键修改说明

  1. 主窗口代码移至全局作用域:将原submit_login函数内的主窗口创建代码移出,放在程序最后,确保程序启动后立即创建主窗口并进入Tkinter事件循环。
  2. 初始化数据库游标:新增mycursor = mysqldb.cursor(),否则无法执行数据库的增查操作。
  3. 修复变量作用域:将submit_registration和submit_login函数分别嵌套在register和login函数内部,这样内部函数可以直接访问外部函数的局部变量(如输入框、窗口对象),避免全局变量污染。
  4. 调整按钮创建位置:将注册、登录的提交按钮创建代码移至对应窗口的创建函数内,确保窗口显示时按钮已经存在,用户可以正常点击提交。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:37:47