【问题标题】:Tkinter - How to close one window whilst opening another window in Tkinter - Python 3Tkinter - 如何在 Tkinter 中打开另一个窗口时关闭一个窗口 - Python 3
【发布时间】:2018-05-18 01:59:43
【问题描述】:

我对 Tkinter 非常陌生,必须将它用于我的编程课程,我正在寻求帮助以了解如何在成功登录窗口打开时销毁/隐藏登录窗口。请记住,我是 tkinter 的新手。谢谢。

import tkinter
from tkinter import ttk

---------------------------------------------- -------------------------------------------------- ----------------------

class loginWindow():


def __init__(self, master): #constructor

    self.master = master
    self.master.title("Main Menu") #window title
    self.master.geometry("400x400") #window size
    self.master.configure(background = "#fff1d0") #window colour, hexadecimal codes

    #self.photo = PhotoImage(file = "filename.png") #sets up image
    #self.photoLabel = Label(self.master, image = self.photo, bg = "red") #puts image on label
    #self.photoLabel.place(x=350 y=600) #places onto the screen with specified coordinates

    self.enterLabel = tkinter.Label(self.master, text = "Launcher", font = ("Helvetica", 16), bg = "#fff1d0")
    self.enterLabel.pack(pady = 10)

    self.emptySpace = tkinter.Label(self.master, text = " ", bg = "#fff1d0")
    self.emptySpace.pack(pady = 10)

    self.username = tkinter.Label(self.master, text = "Username:", bg = "#fff1d0") #Label widget and properties
    self.username.pack()
    self.enterUser = tkinter.ttk.Entry(self.master, width = 40) #Creates text entry widget
    self.enterUser.pack()

    self.password = tkinter.Label(self.master, text = "Password:", bg = "#fff1d0") #Label widget and properties
    self.password.pack()
    self.enterPass = tkinter.ttk.Entry(self.master, width = 40, show = "*") #Creates text entry widget
    self.enterPass.pack()

    self.loginButton = tkinter.ttk.Button(self.master, width = 40, text = "Login", command = self.loginAccess)
    self.loginButton.pack(pady = 10)


def loginAccess(self):

    username = "Aaron" #Needs to become a dictionary or database  or something with all usernames and passwords
    password = "Password"
    global userUsername
    userUsername = self.enterUser.get()
    userPassword = self.enterPass.get()

    if userUsername != username and userPassword != password:

         self.enterLabel.configure(text = "Invalid username and password. Please try again.", font = (10))
         self.enterUser.delete(0, "end")
         self.enterPass.delete(0, "end")

    if userUsername == username and userPassword != password:

        self.enterLabel.configure(text="Invalid password. Please try again.", font = (10))
        self.enterPass.delete(0, "end")

    if userUsername == username and userPassword == password:

        self.enterUser.delete(0, "end")
        self.enterPass.delete(0, "end")
        self.goToSuccessfulLoginWindow()

def goToSuccessfulLoginWindow(self):

    root2 = tkinter.Toplevel()
    myGUI = successfulLogin(root2)
    myGUI.setName(userUsername)

---------------------------------------------- -------------------------------------------------- ----------------------

class successfulLogin():


def __init__(self, master):

    self.master = master
    self.master.title("Login Successful")
    self.master.geometry("700x700")
    self.master.configure(background="#fff1d0")

    self.confirmLabel = tkinter.Label(self.master, text = " ", font = ("Helvetica", 16), bg = "#fff1d0")
    self.confirmLabel.pack()

    self.quitButton = tkinter.ttk.Button(self.master, text = "Quit", command = self.quitWindow)
    self.quitButton.pack()

    self.logOutButton = tkinter.ttk.Button(self.master, text = "Log out", command = self.logout)
    self.logOutButton.pack()

def setName(self, username):
    name = username
    self.confirmLabel.configure(text = "welcome " + name)

def quitWindow(self):
    self.master.quit()

def logout(self):
    loginWindow(root)
    self.master.destroy()

---------------------------------------------- -------------------------------------------------- ----------------------

def centerWindow(width=300, height=200):
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width / 2) - (width / 2)
y = (screen_height / 2) - (height / 2)
root.geometry('%dx%d+%d+%d' % (width, height, x, y))


root = tkinter.Tk()
centerWindow(310, 375)
root.resizable(False,False)
loginWindow(root)
root.mainloop(

【问题讨论】:

  • 代码中的缩进需要修复。另外,您发布的代码太多了。如果您的问题是关于如何管理两个不同的窗口,您可能只需要十几或两行代码来说明您遇到的问题。见How to create a Minimal, Complete, and Verifiable Example
  • 您的问题中有很多不需要的代码。给我们直接链接到您的问题的代码。
  • 另外——像if login == True, Then destroy LoginWindow And DrawNewWindow 这样简单的东西就可以了。希望这个伪代码会有所帮助(?)

标签: python tkinter login window ttk


【解决方案1】:

基于this answer可以制作下面的例子。

import tkinter as tk

root = tk.Tk()

#In order to hide main window
root.withdraw()

tk.Label(root, text="This is the main window").pack()

aWindow = tk.Toplevel(root)

def change_window():
    #remove the other window entirely
    aWindow.destroy()

    #make root visible again
    root.iconify()
    root.deiconify()

tk.Button(aWindow, text="This is aWindow", command=change_window).pack()

root.mainloop()

在示例中,首先有一个窗口aWindow,当您单击它上面的按钮时,它会破坏aWindow 并使root 窗口再次可见。

【讨论】: