Home > Net >  How do I make my login button follow through : tkinter
How do I make my login button follow through : tkinter

Time:01-13

I've made this tkinkter home screen page with 3 buttons. However, when I click the buttons it comes up with error and doesn't move on to the login screen. Can anyone help?

My code:

import tkinter as tk

class program(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args,**kwargs)

        self.title("Cars4You")
        self.geometry("750x1450")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.frames = {}

        container = tk.Frame(self)
        container.grid(row=0,column=0, sticky="nsew")
        container.columnconfigure(0,weight=1)
        container.rowconfigure(0,weight=1)
        container.configure(background="blue")

    
        for F in (homePage, staffLogin):
            frame = F(parent=container, controller=self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        
        self.show_frame(homePage)

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

class homePage(tk.Frame):
    def __init__(self, parent, controller, *args, **kwargs):
        tk.Frame.__init__(self,parent,*args, **kwargs)

        

        for i in range(5):
            self.columnconfigure(i, weight=1)
        
        for i in range(5):
            self.rowconfigure(i, weight=1)

        staffLoginButton = tk.Button(self, text="Staff Login", width = 50, height = 20, command= lambda: controller.show_frame(staffLogin))
        staffLoginButton.grid(row=2, column=1)

        managerLoginButton = tk.Button(self, text="Owner Login", width = 50, height = 20)
        managerLoginButton.grid(row=2,column=2)

        customerLoginButton = tk.Button(self, text="Customer Login", width = 50, height = 20)
        customerLoginButton.grid(row=2,column=3)
        
class staffLogin(tk.Frame):
    def __init__(self, parent, controller, *args, **kwargs):
        tk.Frame.__init__(self,parent, *args, **kwargs)

        self.controller = controller

        for i in range(128):
            self.columnconfigure(i,weight=1)

        for i in range(128):
            self.rowconfigure(i,weight=1)

        self.staffLabel = tk.Label(self, text = "Staff Login", font=("Helvectia", 24))
        self.staffLabel.grid(row = 40, column=60)


        self.userIDLabel = tk.Label(self, text = "UserID:")
        self.userIDLabel.grid(sticky="W", row=67,column=59)

        self.userIDInput = tk.Entry(self, width=50, font=("Helvectia",16))
        self.userIDInput.grid(row=67, column=60)

        self.userPasswordLabel = tk.Label(self, text = "Password:")
        self.userPasswordLabel.grid(sticky="W", row=70, column=59)

        self.userPasswordInput = tk.Entry(self,width=50, font=("Helvectia",16))
        self.userPasswordInput.grid(row=70, column=60)

        self.showPassword = tk.Button(self, text="Show Password", command=self.togglePassword())
        self.showPassword.grid(sticky="W", row=71, column=60)

        self.loginButton = tk.Button(self, text="Login", height=2, width=7)
        self.loginButton.grid(sticky="E",row = 71, column=60)

        self.backButton = tk.Button(self, text="Back To Main Menu", height=4, command= lambda: controller.show_frame(homePage))
        self.backButton.grid(row=128, column=0)
    
    def togglePassword(self):
        if self.userPasswordLabel.cget("show") == "*":
            self.userPasswordLabel.config(show= "")
            self.showPassword.config(text="Hide Password")
        else:
            self.userPasswordLabel.config(show="")
            self.showPassword.config(text="Show Password")

thing = program()
thing.mainloop()

CodePudding user response:

  • Removed in line 80 command=self.togglePassword()
  • replaced "show" to "text" in line 90 if self.userPasswordLabel.cget("text") == "*":

Code:

import tkinter as tk

class program(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args,**kwargs)

        self.title("Cars4You")
        self.geometry("750x1450")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.frames = {}

        container = tk.Frame(self)
        container.grid(row=0,column=0, sticky="nsew")
        container.columnconfigure(0,weight=1)
        container.rowconfigure(0,weight=1)
        container.configure(background="blue")

    
        for F in (homePage, staffLogin):
            frame = F(parent=container, controller=self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        
        self.show_frame(homePage)

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

class homePage(tk.Frame):
    def __init__(self, parent, controller, *args, **kwargs):
        tk.Frame.__init__(self,parent,*args, **kwargs)

        

        for i in range(5):
            self.columnconfigure(i, weight=1)
        
        for i in range(5):
            self.rowconfigure(i, weight=1)

        staffLoginButton = tk.Button(self, text="Staff Login", width = 50, height = 20, command= lambda: controller.show_frame(staffLogin))
        staffLoginButton.grid(row=2, column=1)

        managerLoginButton = tk.Button(self, text="Owner Login", width = 50, height = 20)
        managerLoginButton.grid(row=2,column=2)

        customerLoginButton = tk.Button(self, text="Customer Login", width = 50, height = 20)
        customerLoginButton.grid(row=2,column=3)
        
class staffLogin(tk.Frame):
    def __init__(self, parent, controller, *args, **kwargs):
        tk.Frame.__init__(self,parent, *args, **kwargs)

        self.controller = controller

        for i in range(128):
            self.columnconfigure(i,weight=1)

        for i in range(128):
            self.rowconfigure(i,weight=1)

        self.staffLabel = tk.Label(self, text = "Staff Login", font=("Helvectia", 24))
        self.staffLabel.grid(row = 40, column=60)


        self.userIDLabel = tk.Label(self, text = "UserID:")
        self.userIDLabel.grid(sticky="W", row=67,column=59)

        self.userIDInput = tk.Entry(self, width=50, font=("Helvectia",16))
        self.userIDInput.grid(row=67, column=60)

        self.userPasswordLabel = tk.Label(self, text = "Password:")
        self.userPasswordLabel.grid(sticky="W", row=70, column=59)

        self.userPasswordInput = tk.Entry(self,width=50, font=("Helvectia",16))
        self.userPasswordInput.grid(row=70, column=60)

        self.showPassword = tk.Button(self, text="Show Password")
        self.showPassword.grid(sticky="W", row=71, column=60)

        self.loginButton = tk.Button(self, text="Login", height=2, width=7)
        self.loginButton.grid(sticky="E",row = 71, column=60)

        self.backButton = tk.Button(self, text="Back To Main Menu", height=4, command= lambda: controller.show_frame(homePage))
        self.backButton.grid(row=128, column=0)
    
    def togglePassword(self):
        if self.userPasswordLabel.cget("text") == "*":
            self.userPasswordLabel.config(show= "")
            self.showPassword.config(text="Hide Password")
        else:
            self.userPasswordLabel.config(show="")
            self.showPassword.config(text="Show Password")

thing = program()
thing.mainloop()

Output:

enter image description here

Output Staff Login:

enter image description here

CodePudding user response:

There are few issues in your code:

  • show="*" should be set when creating self.userPasswordInput
  • command=self.togglePassword() should be command=self.togglePassword instead
  • self.userPasswordLabel should be self.userPasswordInput instead inside togglePassword()
  • inside togglePassword(), show="" is used in both if and else block. show="*" should be used in else block

Below is the required changes:

class staffLogin(tk.Frame):
    def __init__(self, parent, controller, *args, **kwargs):
        ...
        self.userPasswordInput = tk.Entry(self,width=50, font=("Helvectia",16), show="*") # set show="*" initially
        ...
        self.showPassword = tk.Button(self, text="Show Password", command=self.togglePassword) ### self.togglePassword() -> self.togglePassword
        ...

    def togglePassword(self):
        if self.userPasswordInput.cget("show") == "*":
            self.userPasswordInput.config(show= "")
            self.showPassword.config(text="Hide Password")
        else:
            self.userPasswordInput.config(show="*")
            self.showPassword.config(text="Show Password")
  • Related