簡體   English   中英

在 Tkinter Python 中銷毀一個窗口並打開另一個窗口

[英]Destroy one window and open another in Tkinter Python

我創建了一個帶有 GUI 的圖書館管理系統,並希望在其上添加一個登錄 GUI。 我希望在登錄窗口中首先彈出什么,然后,如果憑據正確,管理系統就會打開。

我面臨的問題是,當我點擊登錄按鈕時,管理系統打開但登錄窗口也停留在那里。 在為管理系統創建窗口之前,我已經嘗試過self.root.destroy()但它關閉了所有窗口並且管理系統也關閉了。`

我能做什么?

class login_system():
    def __init__(self, root):
        self.root = root
        self.root.title('Login')
        self.root.geometry('500x250')
        self.root.config(background='black')
        self.loggedin = False

        user = Label(root, text='Username:', font=('times new roman',20, 'bold'), fg='white', bg='black', padx=15,pady=10)
        user.grid(row=0, column=0, padx=10, pady=10)

        password = Label(root, text='Password:', font=('times new roman',20, 'bold'), fg='white', bg='black', padx=15 )
        password.grid(row=1, column=0, padx=10, pady=10)

        self.user_var= StringVar()
        self.pass_var= StringVar()

        user_ent = Entry(root, width=20, font=('times new roman',18, 'bold'),textvariable=self.user_var)
        user_ent.grid(row=0, column=1)

        pass_ent = Entry(root, width=20,font=('times new roman',18, 'bold'),textvariable=self.pass_var)
        pass_ent.grid(row=1, column=1)

        submit = Button(root, text='Login', command=self.login,font=('times new roman',18, 'bold'))
        submit.grid(row=3, column=1, pady=10)

    def login(self):
        
        userinfo = self.user_var.get()
        passinfo= self.pass_var.get()
        conn = mysql.connector.connect(host='localhost', username='root', password = 'testpass', database = 'librarydb')
        my_cursor = conn.cursor()
        my_cursor.execute('SELECT username, password FROM login_system')
        rows = my_cursor.fetchall()

        conn.close()
        for row in rows:
            if row[0] ==userinfo:
                if row[1]==passinfo:
                    
                    tmsg.showinfo('Successful!', 'Logged In')
                    self.loggedin=True
                    self.newWindow= Toplevel(self.root)
                    
                    self.app = LibraryManagementSystem(self.newWindow)
                                                  
                    
                else:
                    tmsg.showinfo('Incorrect', 'Incorrect Password. Please try again')
                    break
            else:
                tmsg.showinfo('Incorrect', 'Incorrect username. Please try again')
                break
        

class LibraryManagementSystem():
    def __init__(self, root):
        self.root= root
        self.root.title('Library Management System')
        self.root.geometry('1366x768')

在這里,您可以使用.withdraw方法。 這將隱藏主窗口而不會破壞整個應用程序。 因此,您可以獲取Toplevel()並隱藏原始窗口

self.root.withdraw()

這將隱藏主窗口而不破壞它。

並且,在你完成之后,你想要顯示登錄窗口,

self.root.deiconify()

這將使隱藏的窗口被顯示。

當您destroy()登錄窗口時,所有其他窗口也會被銷毀,因為它是根窗口。 為了避免這種情況,登錄窗口需要是 Toplevel,而不是 Tk。
您可以像這樣創建根窗口:

root = Tk()
root.iconify()
login_system(root)

root.iconify()隱藏根窗口,但它仍然存在,因此其他窗口不會關閉。 然后在登錄類中,您需要像這樣創建一個 Toplevel:

class login_system():
    def __init__(self, root):
        self.root = root
        self.login_window = Toplevel(self.root)
        self.login_window.title('Login')
        self.login_window.geometry('500x250')
        self.login_window.config(background='black')
        ...

這類似於您在用戶登錄后為管理系統創建窗口的方式。
創建新窗口后,您需要像這樣銷毀登錄:

self.newWindow= Toplevel(self.root)
                    
self.app = LibraryManagementSystem(self.newWindow)
self.login_window.destroy()    #This bit is new

然后它會按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM