2017-03-20 6 views
0

これはログインメニューの下の私のコードです。ユーザーがログオンしたら、ログインメニューを隠したり削除したりしてください。.withdraw()と.destroy()を試してみてください。間違った場所、どんなassitanceも非常に高く評価されるでしょう!トップレベルを開いたときにログインウィンドウを削除するにはどうすればよいですか?

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

1:

それは次のようになりますあなただけ多くても1つで持っていることになっているとき、あなたは2つのメインループを持っています。 2:ログインは「root」になるので、ログインはTkのサブクラスではありません。 – abccd

+0

Naseem、私はあなたのプロフィールからいくつかの質問に対して答えを得ていますが、あなたはそれを受け入れるか、 。私は誰かが私の質問に答えるときに何をすべきですか?(http://stackoverflow.com/help/someone-answers) –

+0

私は答えをアップアップすることができますが、15人の担当者が公然と表示されています。助けてくれた人たちをアップアップします。ありがとうNas –

答えて

0

コードの1つの問題は、mainloopを複数回呼び出すことです。原則として、tkinterのGUIでは常にmainloopを正確に1回呼び出す必要があります。

ログインウィンドウを行う最も一般的な方法は、ログインウィンドウを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() 
+0

ああありがとう:)ありがとうございました –

+0

上記の回答コードを自分自身に適合させるために、rootがグローバル変数である理由を説明してください。事前に感謝:) –

+0

@ NaseemTomkinson:それはする必要はありません。それは間違いだった。それは以前のバージョンから残されていました。私はそれを修正します。 –

関連する問題