[英]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.