簡體   English   中英

python tkinter打開新窗口,單擊按鈕並關閉第一個窗口

[英]python tkinter open new window with button click and close first window

我有一個登錄窗口。 我想在授予用戶訪問權限時關閉該登錄窗口,並打開一個新窗口。 我經常搜索這個簡單問題的解決方案,但不明白該怎么做。 我嘗試了self.destroy()但它關閉了整個程序。

這是代碼

#!/usr/bin/python

from tkinter import *
from tkinter import ttk


class Login(Tk):
    def __init__(self):
        super().__init__()
        self.uname_var = StringVar()
        self.pword_var = StringVar()
        self.init_widgets()

    def init_widgets(self):
        # frame
        mainframe = ttk.Frame(self, padding='5 5')
        mainframe.grid(row=0, column=0, sticky=(N, E, S, W))
        mainframe.columnconfigure(0, weight=1)
        mainframe.rowconfigure(0, weight=1)

        # label
        ttk.Label(mainframe, text='Username').grid(row=0, column=0, sticky=W)
        ttk.Label(mainframe, text='Password').grid(row=1, column=0, sticky=W)

        # entry
        uname_entry = ttk.Entry(mainframe, width=20, textvariable=self.uname_var)
        uname_entry.grid(row=0, column=1, sticky=(E, W))
        pword_entry = ttk.Entry(mainframe, width=20, textvariable=self.pword_var)
        pword_entry.grid(row=1, column=1, sticky=(E, W))

        # button
        ttk.Button(mainframe, text='Sign in', command=self.check_login).grid(row=2, column=1, sticky=E)

        for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

        uname_entry.focus()
        self.bind('<Return>', self.check_login)

    def check_login(self, *args):
        uname = self.uname_var.get()
        pword = self.pword_var.get()
        if uname == 'admin' and pword == 'admin':
            print("Access Granted")
            new = MainForm()
            new.title("Main Window")
            #self.destory()
            # HERE I WANT TO CLOSE THIS WINDOW
        else:
            print("Access Denied")


class MainForm(Toplevel):
    def __init__(self):
        super().__init__()
        self.init_widgets()

    def init_widgets(self):
        mainframe = ttk.Frame(self, padding='5 5')
        mainframe.grid(column=0, row=0, sticky=(N, E, S, W))
        mainframe.columnconfigure(0, weight=1)
        mainframe.rowconfigure(0, weight=1)
        ttk.Button(mainframe, text='Click me').grid(column=0, row=0, sticky=(N, W))


def main():
    root = Login()
    root.title("Login")
    root.mainloop()

if __name__ == '__main__': main()

在我看來,最好的解決方案是讓GUI的每個部分(登錄頁面,主頁面)成為Frame的子類而不是ToplevelTk 這樣,您可以簡單地銷毀表示登錄框架的框架,並將其替換為代表應用程序主要部分的框架。 這樣您就不必銷毀任何窗口。

Anoter獲得相同效果的方法是使主窗口成為Tk的子類,並使您的登錄窗口成為Toplevel 在啟動時,您可以隱藏根窗口並顯示登錄窗口,然后當用戶登錄時,您可以隱藏或銷毀登錄窗口並顯示根窗口。

暫無
暫無

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

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