Tkinter - 显示带有选项和更改密码按钮的对话框

Tkinter - show dialog with options and change password buttons

我使用一个名为 Thonny 的 python 程序。它曾经制作另一个盒子,里面写着 'You have made it into the main application' 但我现在删除了那段文字。我希望它显示一个选项按钮和一个更改密码按钮。这是代码:

    import tkinter as tk

    class Mainframe(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.frame = FirstFrame(self)
            self.frame.pack()

        def change(self, frame):
            self.frame.pack_forget() # delete currrent 
            frame = frame(self)
            self.frame.pack() # make new frame

    class FirstFrame(tk.Frame):
        def __init__(self, master=None, **kwargs):
            tk.Frame.__init__(self, master, **kwargs)

            master.title("Enter password")
            master.geometry("300x200")

            self.status = tk.Label(self, fg='red')
            self.status.pack()
            lbl = tk.Label(self, text='Enter password')
            lbl.pack()
            self.pwd = tk.Entry(self, show="*")
            self.pwd.pack()
            self.pwd.focus()
            self.pwd.bind('<Return>', self.check)
            btn = tk.Button(self, text="Done", command=self.check)
            btn.pack()
            btn = tk.Button(self, text="Cancel", command=self.quit)
            btn.pack()

        def check(self, event=None):
            if self.pwd.get() == 'password':
               self.master.change(SecondFrame)
            else:
                self.status.config(text="Wrong password")

   class SecondFrame(tk.Frame):
        def __init__(self, master=None, **kwargs):
            tk.Frame.__init__(self, master, **kwargs)
            master.title("Main application")
            master.geometry("600x400")
        def options_button(self):
            def set_password(self):
                    e = tk.Entry(master, show="*", textvariable=self.password_set2)
                    e.pack()
                    but1 = tk.Button(self, text="Done", command=self.password_set)
                    but1.pack()
            b = tk.Button(self, text="Set your password", command=self.set_password)
            b.pack()
            c = tk.Button(self, text="Options", command=self.options_button)
            c.pack()



    if __name__=="__main__":
        app=Mainframe()
        app.mainloop()

This is What is not working. This is what it originally did

所以我玩了一下,我想这就是你想要的。我还稍微更改了您的代码,因为我总是觉得最好将 self 放在多类应用程序中所有小部件的前面。

import tkinter as tk

class FirstFrame(tk.Frame):
    def __init__(self, master, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.pack()

        master.title("Enter password")
        master.geometry("300x200")
        self.status = tk.Label(self, fg='red')
        self.status.pack()
        self.lbl = tk.Label(self, text='Enter password')
        self.lbl.pack()
        self.pwd = tk.Entry(self, show="*")
        self.pwd.pack()
        self.pwd.focus()
        self.pwd.bind('<Return>', self.check)
        self.btn = tk.Button(self, text="Done", command=self.check)
        self.btn.pack()
        self.btn = tk.Button(self, text="Cancel", command=self.quit)
        self.btn.pack()

    def check(self, event=None):
      if self.pwd.get() == app.password:
        self.destroy() #destroy current window and open next
        self.app= SecondFrame(self.master)
      else:
        self.status.config(text="Wrong password")

class SecondFrame(tk.Frame):
#re organised a lot in here
    def __init__(self, master, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.pack()
        master.title("Main application")
        master.geometry("600x400")
        self.c = tk.Button(self, text="Options", command=self.options_button)
        self.c.pack()
        self.e = tk.Entry(self.master, show="*")
    def options_button(self):
        self.e.pack()
        self.but1 = tk.Button(self, text="Change password", command=self.set_password)
        self.but1.pack()
    def set_password(self):
        app.password=self.e.get()

if __name__=="__main__":
    root = tk.Tk() #removed your mainframe class
    app=FirstFrame(root)
    #set an attribute of the application for the password
    #similar to a global variable
    app.password = "password"
    root.mainloop()

因此,根据我所做的,系统会提示您输入密码,如果输入正确,它将转到下一个屏幕,然后会出现一个选项按钮,如果单击它,则会出现一个输入框,允许用户更改密码