【问题标题】:python tkinter open new window with button click and close first windowpython tkinter用按钮点击打开新窗口并关闭第一个窗口
【发布时间】:2016-08-29 22:30:03
【问题描述】:

我有一个登录窗口。我想在授予用户访问权限时关闭该登录窗口,然后打开一个新窗口。我进行了很多搜索以找到解决这个简单问题的方法,但不明白如何做到这一点。我试过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()

【问题讨论】:

  • 您是否真的需要销毁一个窗口并打开另一个窗口,或者只需删除登录窗口中的所有内容并用其他内容替换它就可以了吗?
  • @BryanOakley 没关系如果更换框架或小部件是做我想做的事情的唯一方法
  • 这不是唯一的方式,它可以说是最好的方式。

标签: python python-3.x user-interface tkinter


【解决方案1】:

在我看来,最好的解决方案是让 GUI 的每个部分(登录页面、主页)成为 Frame 的子类,而不是 ToplevelTk。这样,您可以简单地销毁代表登录框架的框架,并将其替换为代表应用程序主要部分的框架。这样您就不必破坏任何窗户。

获得相同效果的另一种方法是使您的主窗口成为Tk 的子类,并让您的登录窗口成为Toplevel。启动时可以隐藏根窗口并显示登录窗口,然后当用户登录时可以隐藏或销毁登录窗口并显示根窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多