如何在打开顶层时删除登录窗口?

时间:2017-03-20 19:59:31

标签: python python-3.x tkinter

所以这是我下面的代码,用于登录菜单。用户登录后,我希望隐藏或删除登录菜单。我已经尝试了.withdraw().destroy()。我确定我将代码放在错误的地方,我们非常感谢您的帮助!

from tkinter import *
import tkinter as tk
import sqlite3
import hashlib
import os
import weakref


def main():
  root = Tk()
  width = 600 #sets the width of the window
  height = 600 #sets the height of the window
  widthScreen = root.winfo_screenwidth() #gets the width of the screen
  heightScreen = root.winfo_screenheight() #gets the height of the screen
  x = (widthScreen/2) - (width/2) #finds the center value of x
  y = (heightScreen/2) - (height/2) #finds the center value of y
  root.geometry('%dx%d+%d+%d' % (width, height, x, y))#places screen in center
  root.resizable(width=False, height=False)#Ensures that the window size cannot be changed 
  filename = PhotoImage(file = 'Login.gif') #gets the image from directory
  background_label = Label(image=filename) #makes the image
  background_label.place(x=0, y=0, relwidth=1, relheight=1)#palces the image
  logins = login(root)
  root.mainloop()

class login(Tk):
  def __init__(self, master):
    self.__username = StringVar()
    self.__password = StringVar()
    self.__error = StringVar()
    self.master = master
    self.master.title('Login')
    userNameLabel = Label(self.master, text='UserID: ', bg=None, width=10).place(relx=0.300,rely=0.575)
    userNameEntry = Entry(self.master, textvariable=self.__username, width=25).place(relx=0.460,rely=0.575)
    userPasswordLabel = Label(self.master, text='Password: ', bg=None, width=10).place(relx=0.300,rely=0.625)
    userPasswordEntry = Entry(self.master, textvariable=self.__password, show='*', width=25).place(relx=0.460,rely=0.625)
    errorLabel = Label(self.master, textvariable=self.__error, bg=None, fg='red', width=35).place(relx=0.508,rely=0.545, anchor=CENTER)
    loginButton = Button(self.master, text='Login', command=self.login_user, bg='white', width=15).place(relx=0.300,rely=0.675)
    clearButton = Button(self.master, text='Clear', command=self.clear_entry, bg='white', width=15).place(relx=0.525,rely=0.675)
    self.master.bind('<Return>', lambda event: self.login_user()) #triggers the login subroutine if the enter key is pressed

  def login_user(self):
    username = self.__username.get()
    password = self.__password.get()
    hashPassword = (password.encode('utf-8'))
    newPass = hashlib.sha256()
    newPass.update(hashPassword)
    if username == '':
      self.__error.set('Error! No user ID entered')
    elif password == '':
      self.__error.set('Error! No password entered')
    else:
      with sqlite3.connect ('pkdata.db') as db:
        cursor = db.cursor()
        cursor.execute("select userID, password from users where userID=?",(username,))
        info = cursor.fetchone()
        if info is None:
          self.__error.set('Error! Login details not found!')
        else:
          dbUsername = info[0]
          dbPassword = info[1]
          if username == dbUsername or newPass.hexdigest() == dbPassword:
            self.open_main_menu()
            self.master.withdraw()
          else:
            self.__error.set('Error! please try again')
            self.clear_entry()

  def destroy(self):
    self.master.destroy()

  def clear_entry(self):
    self.__username.set('')
    self.__password.set('')

  def open_main_menu(self):
    root_main = Toplevel(self.master)
    root_main.state('zoomed')
    Main = main_menu(root_main)
    root_main.mainloop()


class main_menu():
  def __init__(self, master):
    pass

if __name__ == '__main__':
   main()

1 个答案:

答案 0 :(得分:1)

您的代码中的一个问题是,您不止一次致电mainloop。作为一般规则,您应该始终在tkinter GUI中调用mainloop一次。

执行登录窗口的最常用方法是使登录窗口成为Toplevel的实例,并将主GUI程序放在根窗口中。启动时,您可以隐藏主窗口并显示登录窗口。如果登录成功,请隐藏登录窗口并显示根窗口。

它看起来像这样:

import tkinter as tk

class Login(tk.Toplevel):
    def __init__(self, root):
        super().__init__(root)

        self.root = root

        username_label = tk.Label(self, text="Username:")
        password_label = tk.Label(self, text="Password:")
        username_entry = tk.Entry(self)
        password_entry = tk.Entry(self)
        submit = tk.Button(self, text="Login", command=self.login)

        username_label.grid(row=0, column=0, sticky="e")
        username_entry.grid(row=0, column=1, sticky="ew")
        password_label.grid(row=1, column=0, sticky="e")
        password_entry.grid(row=1, column=1, sticky="ew")
        submit.grid(row=2, column=1, sticky="e")

    def login(self):
        # if username and password are valid:
        self.withdraw()
        self.root.deiconify()

def main():
    root = tk.Tk()
    root.withdraw()

    label = tk.Label(root, text="this is the main application")
    label.pack(fill="both", expand=True, padx=100, pady=100)

    login_window =  Login(root)

    root.mainloop()

if __name__ == "__main__":
    main()