Search code examples
python-3.xtkinterxamppframe

Display different frames based on logged in value in tkinter


I am creating an office management application. In this, there is admin and staff. In the Log In page based on whether it is admin or staff different frames needs to be displayed.

I used an if-else statement for this purpose.I tried to compare the value of username using get() but was unable to print its value inside the function.

Following is the code I executed.


import tkinter as tk
from tkinter import ttk
import mysql.connector


class SchoolApp(tk.Tk):

    BKGR_IMAGE_PATH = 'images\\bg11.png'

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)
        self.geometry("1500x750")

        main_frame = tk.Frame(self,width=200,height=50,highlightbackground="black",highlightthickness=1)
        main_frame.pack(side='top', fill='both', expand='True')

        main_frame.grid_rowconfigure(0, weight=1)
        main_frame.grid_columnconfigure(0, weight=1)

        self.bkgr_image = tk.PhotoImage(file=self.BKGR_IMAGE_PATH)

        self.frames = {}
        for F in (HomePage,LogIn,AdminPage,StaffPage):
            frame = F(main_frame, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew')

        self.show_frame(HomePage)

    def show_frame(self,container):
        frame = self.frames[container]
        frame.tkraise()

class BasePage(tk.Frame):

    def __init__(self, parent, controller):
        super().__init__(parent)

        label_bkgr = tk.Label(self, image=controller.bkgr_image)
        label_bkgr.place(x=0,y=0)  # Center label w/image.


class HomePage(BasePage):

    def __init__(self, parent, controller):

        super().__init__(parent, controller)

        home_frame = tk.Frame(self, width=200, height=100, background="white")
        home_frame.grid(row=50, column=150, padx=300, pady=100)

        self.label_title = tk.Label(home_frame, text="Office Management System", font=("Helvetica", 40), bg="white")
        self.label_title.grid(row=0, column=0)

        staff_frame = tk.Frame(home_frame, width=100, height=50)
        staff_frame.grid(row=55, column=0, padx=50, pady=50)

        self.staff_Image = tk.PhotoImage(file="images\\staff1.png")
        self.staff_Image_Pack = tk.Label(staff_frame, image=self.staff_Image)
        self.staff_Image_Pack.grid()

        self.staff_button = tk.Button(home_frame, text="Staff", width=20, font=("Helvetica", 12),command = lambda: controller.show_frame(LogIn))
        self.staff_button.grid(row=60, column=0, pady=20)

        admin_frame = tk.Frame(home_frame, width=100, height=50)
        admin_frame.grid(row=55, column=10, padx=50, pady=50)

        self.Admin_Image = tk.PhotoImage(file="images\\admin1.png")
        self.Admin_Image_Pack = tk.Label(admin_frame, image=self.Admin_Image)
        self.Admin_Image_Pack.grid()

        self.admin_button = tk.Button(home_frame, text="Admin", width=20, font=("Helvetica", 12),command = lambda: controller.show_frame(LogIn))
        self.admin_button.grid(row=60, column=10, pady=20)

class LogIn(BasePage):

    def __init__(self,parent,controller):
        super().__init__(parent, controller)

        login_window = tk.Frame(self, width=200, height=100, background="white")
        login_window.grid(row=50, column=150, padx=300, pady=100)

        login_img_frame = tk.Frame(login_window, width=200, height=50, background="white")
        login_img_frame.grid(row=55, column=0, padx=50, pady=50)
        self.login_Image = tk.PhotoImage(file="images\\lock3.png")
        self.login_Image_Pack = tk.Label(login_img_frame, image=self.login_Image)
        self.login_Image_Pack.grid()

        login_frame = tk.Frame(login_window, width=100, height=50, background="white", highlightbackground="black",highlightthickness=1)
        login_frame.grid(row=55, column=10, padx=50, pady=50)

        self.label_title = tk.Label(login_frame, text="Log In", font=("Helvetica", 40), bg="white")
        self.label_title.grid(row=0, column=20, padx=10, pady=10)

        self.label_username = tk.Label(login_frame, text="Username", font=("Helvetica", 20), bg="white")
        self.label_username.grid(row=50, column=20, padx=10, pady=10)

        self.entry_username = tk.Entry(login_frame, width=15, font=("Helvetica", 20), bd=3)
        self.entry_username.grid(row=50, column=30, padx=10, pady=10)

        self.label_password = tk.Label(login_frame, text="Password", font=("Helvetica", 20), bg="white")
        self.label_password.grid(row=60, column=20, padx=10, pady=10)

        self.entry_password = tk.Entry(login_frame, width=15, font=("Helvetica", 20), bd=3)
        self.entry_password.grid(row=60, column=30, padx=10, pady=10)

        #print(self.entry_username.get())

        if(self.entry_username.get()=="admin"):
            self.login_button = tk.Button(login_frame, text="Log In", command=lambda:[self.submit(),controller.show_frame(AdminPage)],font=("Helvetica", 20), bg="white")
            self.login_button.grid(row=70, column=25, padx=10, pady=10)
        else:
            self.login_button = tk.Button(login_frame, text="Log In", command=lambda:[self.submit(),controller.show_frame(StaffPage)],font=("Helvetica", 20), bg="white")
            self.login_button.grid(row=70, column=25, padx=10, pady=10)

    def submit(self):

        self.u_name = self.entry_username.get()
        self.p_word = self.entry_password.get()

        employee = mysql.connector.connect(host="localhost", user="root", password="", database="edatabase")
        cursor_variable = employee.cursor()

        cursor_variable.execute("INSERT INTO login VALUES ('" + self.u_name + "','" + self.p_word + "')")
        employee.commit()

        employee.close()

class AdminPage(BasePage):

    def __init__(self,parent,controller):
        super().__init__(parent, controller)

        admin_window = tk.Frame(self, width=200, height=100, background="white")
        admin_window.grid(row=50, column=150, padx=300, pady=100)

        self.label_title_admin = tk.Label(admin_window, text="Welcome Admin", font=("Helvetica", 40), bg="white")
        self.label_title_admin.grid(row=0, column=0, padx=10, pady=10, sticky='W')

        admin_add = tk.Frame(admin_window, width=100, height=50)
        admin_add.grid(row=55, column=0, padx=50, pady=50)

        self.admin_add_Image = tk.PhotoImage(file="images\\add3.png")
        self.admin_add_Image_Pack = tk.Label(admin_add, image=self.admin_add_Image)
        self.admin_add_Image_Pack.grid()

        self.add_staff_button = tk.Button(admin_window, text="Add Staff", width=15, font=("Helvetica", 12))
        self.add_staff_button.grid(row=60, column=0, pady=20)

        admin_delete = tk.Frame(admin_window, width=100, height=50)
        admin_delete.grid(row=55, column=10, padx=50, pady=50)

        self.admin_delete_Image = tk.PhotoImage(file="images\\delete2.png")
        self.admin_delete_Image_Pack = tk.Label(admin_delete, image=self.admin_delete_Image)
        self.admin_delete_Image_Pack.grid()

        self.delete_staff_button = tk.Button(admin_window, text="Remove Staff", width=15, font=("Helvetica", 12))
        self.delete_staff_button.grid(row=60, column=10, pady=20)

        admin_select = tk.Frame(admin_window, width=100, height=50)
        admin_select.grid(row=55, column=20, padx=50, pady=50)

        self.admin_select_Image = tk.PhotoImage(file="images\\select2.png")
        self.admin_select_Image_Pack = tk.Label(admin_select, image=self.admin_select_Image)
        self.admin_select_Image_Pack.grid()

        self.select_staff_button = tk.Button(admin_window, text="Select Staff", width=15, font=("Helvetica", 12))
        self.select_staff_button.grid(row=60, column=20, pady=20)

        admin_display = tk.Frame(admin_window, width=100, height=50)
        admin_display.grid(row=55, column=30, padx=50, pady=50)

        self.admin_display_Image = tk.PhotoImage(file="images\\display1.png")
        self.admin_display_Image_Pack = tk.Label(admin_display, image=self.admin_display_Image)
        self.admin_display_Image_Pack.grid()

        self.display_staff_button = tk.Button(admin_window, text="Display Staff", width=15, font=("Helvetica", 12))
        self.display_staff_button.grid(row=60, column=30, pady=20)

class StaffPage(BasePage):

    def __init__(self,parent,controller):

        super().__init__(parent, controller)

        staff_window = tk.Frame(self, width=200, height=100, background="white", highlightbackground="black",highlightthickness=1)
        staff_window.grid(row=50, column=150, padx=300, pady=100)

        self.label_title_staff = tk.Label(staff_window, text="Welcome Staff", font=("Helvetica", 40), bg="white")
        self.label_title_staff.grid(row=0, column=0, padx=10, pady=10, sticky='W')

        staff_register = tk.Frame(staff_window, width=100, height=50)
        staff_register.grid(row=55, column=0, padx=50, pady=50)

        self.register_Image = tk.PhotoImage(file="images\\register1.png")
        self.register_Image_Pack = tk.Label(staff_register, image=self.register_Image)
        self.register_Image_Pack.grid()

        self.register_staff_button = tk.Button(staff_window, text="Add Details", width=15, font=("Helvetica", 12))
        self.register_staff_button.grid(row=60, column=0, pady=20)

        staff_display = tk.Frame(staff_window, width=100, height=50)
        staff_display.grid(row=55, column=30, padx=50, pady=50)

        self.staff_display_Image = tk.PhotoImage(file="images\\display1.png")
        self.staff_display_Image_Pack = tk.Label(staff_display, image=self.staff_display_Image)
        self.staff_display_Image_Pack.grid()

        self.display_staff_button = tk.Button(staff_window, text="Display Details", width=15, font=("Helvetica", 12))
        self.display_staff_button.grid(row=60, column=30, pady=20)


app = SchoolApp()
app.mainloop()


This is my log in page code

class LogIn(BasePage):

    def __init__(self,parent,controller):
        super().__init__(parent, controller)

        login_window = tk.Frame(self, width=200, height=100, background="white")
        login_window.grid(row=50, column=150, padx=300, pady=100)

        login_img_frame = tk.Frame(login_window, width=200, height=50, background="white")
        login_img_frame.grid(row=55, column=0, padx=50, pady=50)
        self.login_Image = tk.PhotoImage(file="images\\lock3.png")
        self.login_Image_Pack = tk.Label(login_img_frame, image=self.login_Image)
        self.login_Image_Pack.grid()

        login_frame = tk.Frame(login_window, width=100, height=50, background="white", highlightbackground="black",highlightthickness=1)
        login_frame.grid(row=55, column=10, padx=50, pady=50)

        self.label_title = tk.Label(login_frame, text="Log In", font=("Helvetica", 40), bg="white")
        self.label_title.grid(row=0, column=20, padx=10, pady=10)

        self.label_username = tk.Label(login_frame, text="Username", font=("Helvetica", 20), bg="white")
        self.label_username.grid(row=50, column=20, padx=10, pady=10)

        self.entry_username = tk.Entry(login_frame, width=15, font=("Helvetica", 20), bd=3)
        self.entry_username.grid(row=50, column=30, padx=10, pady=10)

        self.label_password = tk.Label(login_frame, text="Password", font=("Helvetica", 20), bg="white")
        self.label_password.grid(row=60, column=20, padx=10, pady=10)

        self.entry_password = tk.Entry(login_frame, width=15, font=("Helvetica", 20), bd=3)
        self.entry_password.grid(row=60, column=30, padx=10, pady=10)

        #print(self.entry_username.get())

        if(self.entry_username.get()=="admin"):
            self.login_button = tk.Button(login_frame, text="Log In", command=lambda:[self.submit(),controller.show_frame(AdminPage)],font=("Helvetica", 20), bg="white")
            self.login_button.grid(row=70, column=25, padx=10, pady=10)
        else:
            self.login_button = tk.Button(login_frame, text="Log In", command=lambda:[self.submit(),controller.show_frame(StaffPage)],font=("Helvetica", 20), bg="white")
            self.login_button.grid(row=70, column=25, padx=10, pady=10)

    def submit(self):

        self.u_name = self.entry_username.get()
        self.p_word = self.entry_password.get()

        employee = mysql.connector.connect(host="localhost", user="root", password="", database="edatabase")
        cursor_variable = employee.cursor()

        cursor_variable.execute("INSERT INTO login VALUES ('" + self.u_name + "','" + self.p_word + "')")
        employee.commit()

        employee.close()

I have no errors. Whether it's admin or staff the else condition works and staff page is getting displayed.

Any help is highly appreciated.


Solution

  • I modified the class LogIn(BasePage) as follows and it works. I changed the submit(self) to submit(self,controller).

    Thank you everyone for your response.

    class LogIn(BasePage):
    
        def __init__(self,parent,controller):
            super().__init__(parent, controller)
    
            login_window = tk.Frame(self, width=200, height=100, background="white")
            login_window.grid(row=50, column=150, padx=300, pady=100)
    
            login_img_frame = tk.Frame(login_window, width=200, height=50, background="white")
            login_img_frame.grid(row=55, column=0, padx=50, pady=50)
            self.login_Image = tk.PhotoImage(file="images\\lock3.png")
            self.login_Image_Pack = tk.Label(login_img_frame, image=self.login_Image)
            self.login_Image_Pack.grid()
    
            login_frame = tk.Frame(login_window, width=100, height=50, background="white", highlightbackground="black",highlightthickness=1)
            login_frame.grid(row=55, column=10, padx=50, pady=50)
    
            self.label_title = tk.Label(login_frame, text="Log In", font=("Helvetica", 40), bg="white")
            self.label_title.grid(row=0, column=20, padx=10, pady=10)
    
            self.label_username = tk.Label(login_frame, text="Username", font=("Helvetica", 20), bg="white")
            self.label_username.grid(row=50, column=20, padx=10, pady=10)
    
            self.entry_username = tk.Entry(login_frame, width=15, font=("Helvetica", 20), bd=3)
            self.entry_username.grid(row=50, column=30, padx=10, pady=10)
    
            self.label_password = tk.Label(login_frame, text="Password", font=("Helvetica", 20), bg="white")
            self.label_password.grid(row=60, column=20, padx=10, pady=10)
    
            self.entry_password = tk.Entry(login_frame, width=15, font=("Helvetica", 20), bd=3)
            self.entry_password.grid(row=60, column=30, padx=10, pady=10)
    
            #print(self.entry_username.get())
    
            self.login_button = tk.Button(login_frame, text="Log In", command=lambda:self.submit(controller),font=("Helvetica", 20), bg="white")
            self.login_button.grid(row=70, column=25, padx=10, pady=10)
    
    
        def submit(self,controller):
    
            self.u_name = self.entry_username.get()
            self.p_word = self.entry_password.get()
    
            employee = mysql.connector.connect(host="localhost", user="root", password="", database="edatabase")
            cursor_variable = employee.cursor()
    
            cursor_variable.execute("INSERT INTO login VALUES ('" + self.u_name + "','" + self.p_word + "')")
            employee.commit()
    
            employee.close()
    
            if (self.u_name== "admin"):
                controller.show_frame(AdminPage)
            else:
                controller.show_frame(StaffPage)