【问题标题】:Destroy one window and open another in Tkinter Python在 Tkinter Python 中销毁一个窗口并打开另一个窗口
【发布时间】:2021-09-24 12:11:42
【问题描述】:

我创建了一个带有 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')

【问题讨论】:

标签: python oop user-interface tkinter


【解决方案1】:

当您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

然后一切都会按预期工作。

【讨论】:

  • 谢谢!有效。带有 Tk() 的 Root 最初是在登录系统中形成的,但后来 self.root.withdraw() 在那里工作
  • @TwaritShah 很高兴我能帮上忙。如果您喜欢,请将此答案标记为已接受。
【解决方案2】:

在这里,您可以使用.withdraw 方法。这将隐藏主窗口而不会破坏整个应用程序。所以,你可以得到你的Toplevel() 并隐藏原来的窗口

self.root.withdraw()

这将隐藏主窗口而不破坏它。

而且,在你完成后,你想显示登录窗口,

self.root.deiconify()

这将使隐藏的窗口显示出来。

【讨论】:

  • @TwaritShah 考虑接受并投票赞成答案:)
猜你喜欢
  • 2018-05-11
  • 1970-01-01
  • 2018-05-18
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多