Question

So basically, this is my code:

#Imports Tk gui syntax
from Tkinter import *

#Creates App class
class App(Tk):

    #Initiates class
    def __init__(self):

        #Initiates Tk
        Tk.__init__(self)

        #Creates title of app
        self.title("BMI Calculator")

        #adds extra line for a cleaner gui
        self.fillerLine = Label(self, text = "")
        self.fillerLine.grid(row=0, column=0)

        #asks user for height
        self.hgtOutput = Label(self, text = "What is your height (in inches)? :")
        self.hgtOutput.grid(row=1, column=0)

        #user inputs height in inches using a slider
        self.hgtInput = Scale(self, from_=0, to=96, orient=HORIZONTAL, length=450)
        self.hgtInput.pack()
        self.hgtInput.grid(row=1, column=1)

        #button asking user to confirm height
        self.btnConfirmHGT = Button(self, text = "Confirm Your Hegiht", command = self.confirmHGT)
        self.btnConfirmHGT.grid(row=3, column=0)

        #prints the height the user input in feet and inches
        self.printHGT = Label(self, text = "\n\n")
        self.printHGT.grid(row=3, column=1)

        #extra line for cleaner gui
        self.fillerLine = Label(self, text = "-------------------------------------------------------------------------------------")
        self.fillerLine.grid(row=4, column=0, columnspan=2)

        #asks user for weight in pounds
        self.wghtOutput = Label(self, text = "What is your weight (in pounds)? :")
        self.wghtOutput.grid(row=5, column=0)

        #user inputs weight using a slider
        self.wghtInput = Scale(self, from_=0, to=400, orient=HORIZONTAL, length=450)
        self.wghtInput.pack()
        self.wghtInput.grid(row=5, column=1)

        #button to start calculations
        self.btnCalc = Button(self, text = "Calculate", command = self.calculate)
        self.btnCalc.grid(row=6, columnspan=2)

        #extra line for cleaner gui
        self.fillerLine = Label(self, text = "---------------------------------------------")
        self.fillerLine.grid(row=7, column=0, columnspan=2)

        #prints users BMI
        self.tellBMI = Label(self, text = "")
        self.tellBMI.grid(row=8, column=0, columnspan=2)

        #prints what category the user is in, underweight, normal, overweight, obese
        self.catBMI = Label(self, text = "")
        self.catBMI.grid(row=9, column=0, columnspan=2)

        #extra line for cleaner gui
        self.fillerLine = Label(self, text = "---------------------------------------------")
        self.fillerLine.grid(row=10, column=0, columnspan=2)

        self.mainloop()

    #function to make sure the user put in the correct height
    def confirmHGT(self):
        feet = (self.hgtInput.get())/12
        inches = (self.hgtInput.get())%12
        #print the height the user input
        self.printHGT["text"] = "\nYou're height is : %s ft. & %s in. \n" % (feet, inches)

    #function that calculates BMI and places it within a category
    def calculate(self):
        #Formula calculating BMI using the height and weight given by the user
        BMI = ((self.wghtInput.get()/float(self.hgtInput.get() ** 2))*703)
        #Prints users BMI
        self.tellBMI["text"] = "You're BMI is:\n %2.1f\n" % (BMI)
        #
        if BMI < 18.5:
            self.catBMI["text"] = "Grab a cheeseburger! You are underweight."
        elif BMI >= 18.5 and BMI <= 24.9:
             self.catBMI["text"] = "Congratulations! You are normal!"
        elif BMI >= 25.0 and BMI <= 29.9:
             self.catBMI["text"] = "Maybe eat some salad! You are overweight."
        elif BMI >= 30.0:
             self.catBMI["text"] = "Hit the treadmills! You are obese."
        else:
             pass

#creates an instance of the App() class
def main():
    a = App()

#runs main() function
if __name__ == "__main__":
  main()

The code runs perfectly fine for what I want to do, I'm just trying to make some minor improvements to learn. What I'm trying to do is, if BMI is in the underweight category, give the "Grab a cheeseburger! You are underweight." statement a yellow background. If in the normal category, give the "Congratulations! You are normal!" statement a green background. If in the overweight category, a yellow background, and the obese category a red background. All with keeping the normal background until the calculate button is pressed.

I tried the,

tag_add()
tag_config()

but I can't seem to figure it out, and don't know where to go next!

Was it helpful?

Solution

Well, just set the background property when you change the text property:

if BMI < 18.5:
    self.catBMI["text"] = "Grab a cheeseburger! You are underweight."
    self.catBMI["background"] = "yellow"
elif BMI >= 18.5 and BMI <= 24.9:
    self.catBMI["text"] = "Congratulations! You are normal!"
    self.catBMI["background"] = "green"
elif BMI >= 25.0 and BMI <= 29.9:
    self.catBMI["text"] = "Maybe eat some salad! You are overweight."
    self.catBMI["background"] = "orange"
elif BMI >= 30.0:
    self.catBMI["text"] = "Hit the treadmills! You are obese."
    self.catBMI["background"] = "red"
else:
    pass

Btw. I don’t think you should call the self.mainloop inside the __init__ method. Doing so will prevent it from ever leaving that method, and that doesn’t seem to be right. Instead, call the mainloop after initializing the app:

def main():
    a = App()
    a.mainloop()

As a futher note, your if/else structure is doing more checks than necessary. If you first check if BMI < 18.5 and that is not the case, then it is automatically true that BMI >= 18.5. So you can leave out all the first checks of the elifs because they are automatically true since the previous cases were not true. Similarly, the else block is never executed. So it’s all just this:

if BMI < 18.5:
    self.catBMI["text"] = "Grab a cheeseburger! You are underweight."
    self.catBMI["background"] = "yellow"
elif BMI <= 24.9:
    self.catBMI["text"] = "Congratulations! You are normal!"
    self.catBMI["background"] = "green"
elif BMI <= 29.9:
    self.catBMI["text"] = "Maybe eat some salad! You are overweight."
    self.catBMI["background"] = "orange"
else:
    self.catBMI["text"] = "Hit the treadmills! You are obese."
    self.catBMI["background"] = "red"
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top