销毁登录页面窗口并打开一个新窗口

时间:2018-03-17 20:00:02

标签: python user-interface tkinter

我试图在创建新窗口时关闭窗口。输入登录后,将运行以下功能。在MenuPage(窗口)打开时,您对如何关闭此窗口有任何建议吗?

from tkinter import *

class LoginPage():
 def __init__(self):
  window = Tk()

  #UI to retrieve login details
  #While loop when submit is clicked.

  if UserLogins:

    #Maybe here a close window function is ran

    window = Toplevel()
    start= MenuPage(window)

  else:
    print('Incorrect Login')

class MenuPage(object):

 #Menu UI

if __name__ == '__main__':
    LoginPage()

1 个答案:

答案 0 :(得分:0)

您好,欢迎来到 StackOverflow

您的主要问题是您的班级LoginPage。 您会在班级的Tk()内初始化__init__。一旦该对象被销毁,Tkinter实例也会被销毁。

考虑使用以下方法:

  1. 创建主窗口小部件(例如,基于ToplevelTk
  2. 根据例如创建一个LoginPage您的主窗口小部件中的Frame
  3. 登录尝试后,销毁LoginPage并创建另一个Frame来保存新数据。 (MenuPage)
  4. 使用此方法,您的Tkinter主实例始终运行,并删除或添加对象/小部件。

    如果您不使用MainWidget(应该保留)作为Tk-Instance,那么"未命名"将使用实例。或者使用Tk()作为您的LoginPage的Parent,但不要将其嵌入其中。

    伪代码示例:

    import tkinter as tk
    
    class MainWidget(tk.Tk):
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__()
            self.__load_widgets()
        def __load_widgets(self):
            self.page = LoginPage(self)
            self.page.bind("<LoginEvent>", self.show_menu)
            self.page.grid(sticky=tk.NW+tk.SE)
        def show_menu(self, event=None):
            self.page.destroy()
            self.page=MenuPage(self)
            self.page.grid(sticky=tk.NW+tk.SE)
    
    class LoginPage(tk.Frame):
        def __init__(self, *args, **kwargs):
            tk.Frame.__init__(self, *args, **kwargs)
        def raise_login_result(self):
            """ some event may raise the event you can use from main widget to bind to """
            # ...
            raise("<LoginEvent>")
    
    class MenuPage(tk.Frame):
        def __init__(self, *args, **kwargs):
            tk.Frame.__init__(self, *args, **kwargs)
    
    if __name__ == "__main__":
        app = MainWidget()
        app.mainloop()
    

    修改
    当您的问题扩展到几何管理器时,我在此引用一个相应的documentation on geometry managers(例如网格/包/地点)。本文档显示了相应的接口。