Search code examples
pythontkintercomboboxbind

How to make Combobox selection fill entryboxes on tkinter?


am kind of new to tkinter but i don't know what am doing wrong, i have already defined the function for attributes that would be inside the entryboxes but known are appearing after i ran the code. that is How do I bind the select make combobox so it can autofill the relevant entry boxes from the constructed vehicle class?

from tkinter import *
from tkinter import ttk
import random
import datetime
from tkinter import messagebox 


class Window:

    def __init__(self,root):
        self.root = root
        self.root.title("Car Rental Service")
        self.root.geometry("1350x700+0+0")
        self.var1 = 0
        self.var2 = 0
        self.var3 = 0
        self.var4 = 0
        self.var5 = 0
        self.var6 = 0
        self.var7 = 0
        self.var8 = 0

        def Vehicle(Window):
            values =str(self.cboSelectVehicleType.get())
            vtype = values
            if vtype =="Car":
                KmL.set("10")
                NumberOfDoors.set("4")
                NumberOfPassengers.set("5")
                NumberOfBeds.set("0")
                PlateNumber.set("152-C-854")
                DailyCost.set("20")
                WeeklyCost.set("95")

                n = float(DailyCost.get())
                s = float( NoofDaysRenting.get())
                price = (n*s)
                TC = str('%.2f'%(price))
                Total.set(TC)

            elif vtype =="Van":
                KmL.set("8")
                NumberOfDoors.set("3")
                NumberOfPassengers.set("3")
                NumberOfBeds.set("0")
                PlateNumber.set("142-G-511")
                DailyCost.set("45")
                WeeklyCost.set("260")

                n = float(DailyCost.get())
                s = float( NoofDaysRenting.get())
                price = (n*s)
                TC = str('%.2f'%(price))
                Total.set(TC)

            elif vtype =="Caravans":
                KmL.set("8")
                NumberOfDoors.set("0")
                NumberOfPassengers.set("0")
                NumberOfBeds.set("4")
                PlateNumber.set("131-G-111")
                DailyCost.set("50")
                WeeklyCost.set("350")

                n = float(DailyCost.get())
                s = float( NoofDaysRenting.get())
                price = (n*s)
                TC = str('%.2f'%(price))
                Total.set(TC)


          #===================================Frame==================================
        Mainframe = Frame(self.root, width =1350, height=700, bd=20, relief="raise")
        Mainframe.grid()

        LeftMainframe = Frame(Mainframe, width =1000, height=650, bd=8, relief="raise")
        LeftMainframe.pack(side=LEFT)
        RightMainframe = Frame(Mainframe, width =350, height=650, bd=8, relief="raise")
        RightMainframe.pack(side=RIGHT)

        #===================================Div_Frame==================================

        LeftMainframe1 = Frame(LeftMainframe, width =1000, height=225, bd=8, relief="raise")
        LeftMainframe1.pack(side=TOP)
        LeftMainframe2 = Frame(LeftMainframe, width =1000, height=225, bd=8, relief="raise")
        LeftMainframe2.pack(side=TOP)
        LeftMainframe3 = Frame(LeftMainframe, width =1000, height=100, bd=8, relief="raise")
        LeftMainframe3.pack(side=TOP)
        LeftMainframe4 = Frame(LeftMainframe, width =1000, height=100, bd=8, relief="raise")
        LeftMainframe4.pack(side=TOP)


        RightMainframe1 = Frame(RightMainframe, width =350, height=325, bd=8, relief="raise")
        RightMainframe1.pack(side=TOP)
        RightMainframe2 = Frame(RightMainframe, width =350, height=325, bd=8, relief="raise")
        RightMainframe2.pack(side=BOTTOM)

         #===================================Variable==================================
        self.var1 = IntVar()
        self.var2 = IntVar()
        self.var3 = IntVar()
        self.var4 = IntVar()
        self.var5 = IntVar()


        SelectVehicleType = StringVar()
        SelectMake = StringVar()
        Model = StringVar()
        KmL = StringVar()
        NumberOfDoors = StringVar()
        NumberOfPassengers = StringVar()
        NumberOfBeds = StringVar()
        PlateNumber = StringVar()
        DailyCost = StringVar()
        WeeklyCost = StringVar()
        WeekendCost = StringVar() 
        Total = StringVar()
        CustomerID = StringVar()



        def Reset():
            self.var1.set(0)
            self.var2.set(0)
            self.var3.set(0)
            self.var4.set(0)
            self.var5.set(0)
            self.var6.set(0)
            self.var7.set(0)
            self.var8.set(0)


            SelectVehicleType.set("")
            SelectMake.set("")
            Model.set("")
            KmL.set("")
            NumberOfDoors.set("")
            NumberOfPassengers.set("")
            NumberOfBeds.set("")
            PlateNumber.set("")
            DailyCost.set("")
            WeeklyCost.set("")
            WeekendCost.set("")
            Total.set("")
            CustomerID.set("")
            InvoiceID.set("")
            return Reset


        #------------------------------------LeftmainFrame2----------------------------------
        self.lblSelectVehicleType = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Select VehicleType", bd=8)
        self.lblSelectVehicleType.grid(row=0, column=0)
        self.cboSelectVehicleType =ttk.Combobox(LeftMainframe2, textvariable=self.var1, state='readonly', font=('arial', 10, 'bold'),  width=25, justify='left')

        self.cboSelectVehicleType.bind("<<ComboboxSelected>>",Vehicle)
        self.cboSelectVehicleType['value']=('','Car','Van','Caravans')
        self.cboSelectVehicleType.current(0)
        self.cboSelectVehicleType.grid(row=0, column=1)

        self.lblSelectMake = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Select Make", bd=8)
        self.lblSelectMake.grid(row=0, column=2)
        self.cboSelectMake =ttk.Combobox(LeftMainframe2, textvariable=self.var2, state='readonly', font=('arial', 10, 'bold'),  width=25, justify='left')
        self.cboSelectMake['value']=('','Audi A5','Ford fiesta','Toyota Corrolla','Ford focus','Renault Clio''Renault Other','Citroen Berlingo','Peugot Partner''Renault C','Citroen B','Peugot P',)
        self.cboSelectMake.current(0)
        self.cboSelectMake.grid(row=0, column=3)

        self.lblModel = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Model", bd=8)
        self.lblModel.grid(row=0, column=4)
        self.txtModel = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtModel.grid(row=0, column=5)



        self.lblKmL = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Km/L", bd=8)
        self.lblKmL.grid(row=1, column=0)
        self.txtKmL = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtKmL.grid(row=1, column=1)

        self.lblNumberOfBeds = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Number Of Beds", bd=8)
        self.lblNumberOfBeds.grid(row=1, column=2)
        self.txtNumberOfBeds = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtNumberOfBeds.grid(row=1, column=3)

        self.lblPlateNumber = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="PlateNumber", bd=8)
        self.lblPlateNumber.grid(row=1, column=4)
        self.txtPlateNumber = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtPlateNumber.grid(row=1, column=5)

        self.lblNumberOfPassengers = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Number Of Passengers", bd=8)
        self.lblNumberOfPassengers.grid(row=2, column=0)
        self.txtNumberOfPassengers = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtNumberOfPassengers.grid(row=2, column=1)

        self.lblDailyCost = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Daily Cost", bd=8)
        self.lblDailyCost.grid(row=2, column=2)
        self.txtDailyCost = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtDailyCost.grid(row=2, column=3)

        self.lblWeeklyCost = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Weekly Cost", bd=8)
        self.lblWeeklyCost.grid(row=2, column=4)
        self.txtWeeklyCost = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtWeeklyCost.grid(row=2, column=5)

        self.lblWeekendCost = Label(LeftMainframe2, font=('arial', 10, 'bold'), text=" Weekend Cost", bd=8)
        self.lblWeekendCost.grid(row=3, column=0)
        self.txtWeekendCost = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
        self.txtWeekendCost.grid(row=3, column=1)



         #----------------------------------------Leftmainframe4------------------------------
        self.btnTotal=Button(LeftMainframe4, text='Total', padx=8, pady=8, bd=8, fg="blue", font=('arial', 13, 'bold'), width= 21, height=1,).grid(row=0, column=0)

        self.btnReceipt=Button(LeftMainframe4, text='Receipt', padx=8, pady=8, bd=8, fg="green", font=('arial', 13, 'bold'), width= 21, height=1,).grid(row=0, column=1)

        self.btnReset=Button(LeftMainframe4, text="Reset", command=Reset, padx=8, pady=8, bd=8, fg="blue", font=('arial', 13, 'bold'), width= 21, height=1,).grid(row=0, column=2)


if __name__ =='__main__':
    root= Tk()
    application = Window(root)
    root.mainloop()

Solution

  • I see two main problems

    1. you forgot some StringVar variables - ie. NoofDaysRenting and InvoiceID

    2. you forgot to use textvariable= to assign StringVar to Entry - ie.

       self.txtKmL = Entry(..., textvariable=self.KmL, ...)
      

    so it doesn't update Entry when you update StringVar


    Code after other changes.

    It has textvariable= only in two Entry because there is too much work for me.

    from tkinter import *
    from tkinter import ttk
    import random
    import datetime
    from tkinter import messagebox 
    
    
    class Window:
    
        def __init__(self,root):
            self.root = root
            self.root.title("Car Rental Service")
            self.root.geometry("1350x700+0+0")
    
            # --- Variable ---
    
            self.var1 = IntVar()
            self.var2 = IntVar()
            self.var3 = IntVar()
            self.var4 = IntVar()
            self.var5 = IntVar()
            self.var6 = IntVar()
            self.var7 = IntVar()
            self.var8 = IntVar()
    
            self.SelectVehicleType = StringVar()
            self.SelectMake = StringVar()
            self.Model = StringVar()
            self.KmL = StringVar()
            self.NumberOfDoors = StringVar()
            self.NumberOfPassengers = StringVar()
            self.NumberOfBeds = StringVar()
            self.PlateNumber = StringVar()
            self.DailyCost = StringVar()
            self.WeeklyCost = StringVar()
            self.WeekendCost = StringVar() 
            self.Total = StringVar()
            self.CustomerID = StringVar()
    
            self.NoofDaysRenting = StringVar()
            self.InvoiceID = StringVar()
    
            #===================================Frame==================================
    
            Mainframe = Frame(self.root, width =1350, height=700, bd=20, relief="raise")
            Mainframe.grid()
    
            LeftMainframe = Frame(Mainframe, width =1000, height=650, bd=8, relief="raise")
            LeftMainframe.pack(side=LEFT)
            RightMainframe = Frame(Mainframe, width =350, height=650, bd=8, relief="raise")
            RightMainframe.pack(side=RIGHT)
    
            #===================================Div_Frame==================================
    
            LeftMainframe1 = Frame(LeftMainframe, width =1000, height=225, bd=8, relief="raise")
            LeftMainframe1.pack(side=TOP)
            LeftMainframe2 = Frame(LeftMainframe, width =1000, height=225, bd=8, relief="raise")
            LeftMainframe2.pack(side=TOP)
            LeftMainframe3 = Frame(LeftMainframe, width =1000, height=100, bd=8, relief="raise")
            LeftMainframe3.pack(side=TOP)
            LeftMainframe4 = Frame(LeftMainframe, width =1000, height=100, bd=8, relief="raise")
            LeftMainframe4.pack(side=TOP)
    
            RightMainframe1 = Frame(RightMainframe, width =350, height=325, bd=8, relief="raise")
            RightMainframe1.pack(side=TOP)
            RightMainframe2 = Frame(RightMainframe, width =350, height=325, bd=8, relief="raise")
            RightMainframe2.pack(side=BOTTOM)
    
            #------------------------------------LeftmainFrame2----------------------------------
            self.lblSelectVehicleType = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Select VehicleType", bd=8)
            self.lblSelectVehicleType.grid(row=0, column=0)
            self.cboSelectVehicleType =ttk.Combobox(LeftMainframe2, textvariable=self.var1, state='readonly', font=('arial', 10, 'bold'),  width=25, justify='left')
    
            self.cboSelectVehicleType.bind("<<ComboboxSelected>>", self.Vehicle)
            self.cboSelectVehicleType['value']=('','Car','Van','Caravans')
            self.cboSelectVehicleType.current(0)
            self.cboSelectVehicleType.grid(row=0, column=1)
    
            self.lblSelectMake = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Select Make", bd=8)
            self.lblSelectMake.grid(row=0, column=2)
            self.cboSelectMake =ttk.Combobox(LeftMainframe2, textvariable=self.var2, state='readonly', font=('arial', 10, 'bold'),  width=25, justify='left')
            self.cboSelectMake['value']=('','Audi A5','Ford fiesta','Toyota Corrolla','Ford focus','Renault Clio''Renault Other','Citroen Berlingo','Peugot Partner''Renault C','Citroen B','Peugot P',)
            self.cboSelectMake.current(0)
            self.cboSelectMake.grid(row=0, column=3)
    
            self.lblModel = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Model", bd=8)
            self.lblModel.grid(row=0, column=4)
            self.txtModel = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtModel.grid(row=0, column=5)
    
            self.lblKmL = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Km/L", bd=8)
            self.lblKmL.grid(row=1, column=0)
            self.txtKmL = Entry(LeftMainframe2, textvariable=self.KmL, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtKmL.grid(row=1, column=1)
    
            self.lblNumberOfBeds = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Number Of Beds", bd=8)
            self.lblNumberOfBeds.grid(row=1, column=2)
            self.txtNumberOfBeds = Entry(LeftMainframe2, textvariable=self.NumberOfBeds, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtNumberOfBeds.grid(row=1, column=3)
    
            self.lblPlateNumber = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="PlateNumber", bd=8)
            self.lblPlateNumber.grid(row=1, column=4)
            self.txtPlateNumber = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtPlateNumber.grid(row=1, column=5)
    
            self.lblNumberOfPassengers = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Number Of Passengers", bd=8)
            self.lblNumberOfPassengers.grid(row=2, column=0)
            self.txtNumberOfPassengers = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtNumberOfPassengers.grid(row=2, column=1)
    
            self.lblDailyCost = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Daily Cost", bd=8)
            self.lblDailyCost.grid(row=2, column=2)
            self.txtDailyCost = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtDailyCost.grid(row=2, column=3)
    
            self.lblWeeklyCost = Label(LeftMainframe2, font=('arial', 10, 'bold'), text="Weekly Cost", bd=8)
            self.lblWeeklyCost.grid(row=2, column=4)
            self.txtWeeklyCost = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtWeeklyCost.grid(row=2, column=5)
    
            self.lblWeekendCost = Label(LeftMainframe2, font=('arial', 10, 'bold'), text=" Weekend Cost", bd=8)
            self.lblWeekendCost.grid(row=3, column=0)
            self.txtWeekendCost = Entry(LeftMainframe2, font=('arial', 10, 'bold'), bd=15, width=25, justify='left')
            self.txtWeekendCost.grid(row=3, column=1)
    
            #----------------------------------------Leftmainframe4------------------------------
    
            self.btnTotal=Button(LeftMainframe4, text='Total', padx=8, pady=8, bd=8, fg="blue", font=('arial', 13, 'bold'), width= 21, height=1,).grid(row=0, column=0)
            self.btnReceipt=Button(LeftMainframe4, text='Receipt', padx=8, pady=8, bd=8, fg="green", font=('arial', 13, 'bold'), width= 21, height=1,).grid(row=0, column=1)
            self.btnReset=Button(LeftMainframe4, text="Reset", command=self.Reset, padx=8, pady=8, bd=8, fg="blue", font=('arial', 13, 'bold'), width= 21, height=1,).grid(row=0, column=2)
    
            self.Reset() # reset at start to set default values
    
        def Reset(self):
            self.var1.set(0)
            self.var2.set(0)
            self.var3.set(0)
            self.var4.set(0)
            self.var5.set(0)
            self.var6.set(0)
            self.var7.set(0)
            self.var8.set(0)
    
            self.SelectVehicleType.set("")
            self.SelectMake.set("")
            self.Model.set("")
            self.KmL.set("")
            self.NumberOfDoors.set("")
            self.NumberOfPassengers.set("")
            self.NumberOfBeds.set("")
            self.PlateNumber.set("")
            self.DailyCost.set("")
            self.WeeklyCost.set("")
            self.WeekendCost.set("")
            self.Total.set("")
            self.CustomerID.set("")
            self.InvoiceID.set("")
            self.NoofDaysRenting.set("0")
            # return Reset # makes no sense
    
    
    
        def Vehicle(self, event):
            #print(event)
    
            vtype = str(self.cboSelectVehicleType.get())
    
            if vtype =="Car":
                self.KmL.set("10")
                self.NumberOfDoors.set("4")
                self.NumberOfPassengers.set("5")
                self.NumberOfBeds.set("0")
                self.PlateNumber.set("152-C-854")
                self.DailyCost.set("20")
                self.WeeklyCost.set("95")
    
                n = float(self.DailyCost.get())
                s = float(self.NoofDaysRenting.get())
                price = (n*s)
                TC = str('%.2f'%(price))
                self.Total.set(TC)
    
            elif vtype =="Van":
                self.KmL.set("8")
                self.NumberOfDoors.set("3")
                self.NumberOfPassengers.set("3")
                self.NumberOfBeds.set("0")
                self.PlateNumber.set("142-G-511")
                self.DailyCost.set("45")
                self.WeeklyCost.set("260")
    
                n = float(self.DailyCost.get())
                s = float(self.NoofDaysRenting.get())
                price = (n*s)
                TC = str('%.2f'%(price))
                self.Total.set(TC)
    
            elif vtype =="Caravans":
                self.KmL.set("8")
                self.NumberOfDoors.set("0")
                self.NumberOfPassengers.set("0")
                self.NumberOfBeds.set("4")
                self.PlateNumber.set("131-G-111")
                self.DailyCost.set("50")
                self.WeeklyCost.set("350")
    
                n = float(self.DailyCost.get())
                s = float(self.NoofDaysRenting.get())
                price = (n*s)
                TC = str('%.2f'%(price))
                self.Total.set(TC)
    
    if __name__ =='__main__':
        root= Tk()
        application = Window(root)
        root.mainloop()