0

So far I'm only trying to get the program to work for one user to login, I've just got stuck on getting it to open the next frame after they have logged on. This is the first time I'm using tkinter with python so I'm not very familiar with it. The error that comes up is 'File "", line 65, in NameError: name 'master' is not defined', but I'm not sure how to fix this? Thanks in advance.

from tkinter import *
import tkinter.messagebox as tm
import tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(StartPage)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

class LoginFrame(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        #super().__init__(master)

        self.label_username = Label(self, text="Username")
        self.label_password = Label(self, text="Password")

        self.entry_username = Entry(self)
        self.entry_password = Entry(self, show="*")

        self.label_username.grid(row=0, sticky=E)
        self.label_password.grid(row=1, sticky=E)
        self.entry_username.grid(row=0, column=1)
        self.entry_password.grid(row=1, column=1)

        self.checkbox = Checkbutton(self, text="Keep me logged in")
        self.checkbox.grid(columnspan=2)

        self.logbtn = Button(self, text="Login", command=self._login_btn_clicked)
        self.logbtn.grid(columnspan=2)

        self.pack()

    def _login_btn_clicked(self):
        username = self.entry_username.get()
        password = self.entry_password.get()

        if username == "user" and password == "password":
            tm.showinfo("Login info", "Welcome")
            tk.Button(self, text="Go to main page",
                  command=lambda: master.switch_frame(PageOne)).grid(row=0, sticky=E)
        else:
            tm.showerror("Login error", "Incorrect username")

class PageOne(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="This is page one").pack(side="top", fill="x", pady=10)
        tk.Button(self, text="Return to start page",
                  command=lambda: master.switch_frame(StartPage)).pack()

root = Tk()
lf = LoginFrame(root)
root.mainloop()
  • Your problem, `self` is your `.mainloop window` and `self.destroy()` terminates the `mainloop`. Try this approach [Switch between two frames in tkinter](https://stackoverflow.com/a/49325719/7414759) – stovfl Feb 21 '19 at 17:44
  • Replace the bottom three lines with `if __name__ == "__main__": SampleApp().mainloop()` and change `self.switch_frame(StartPage)` to `self.switch_frame(LoginFrame)` – stovfl Feb 28 '19 at 22:14
  • *"NameError: name 'master' is not defined'"* Change to `self.master....` – stovfl Feb 28 '19 at 22:51

0 Answers0