Personal Projects


example 1 example 2 example 3

Above, we have my first Python GUI application. As you can tell, it is an app that helps you track your fitness goals. It is a completely beginner level app that I developed in one day, but i learned the core concepts of object oriented programming and processing data while building this app in the same way I learned HTML and CSS by developing this website (See About). If you'd like to make this app yourself, the source code is below.

Python code:

import tkinter as tk
from tkinter import ttk

LARGEFONT = ('Courier', 35)

#Window Initialization
class tkinterApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.config(background='#333333')
        container = tk.Frame(self, bg='#333333')
        container.pack(fill="both", expand=True)
        self.center_window(700, 700)

        tkinterApp.geometry(self, '700x700')
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (StartPage, Page1, Page2):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row = 0, column = 0, sticky='nsew')
        self.show_frame(StartPage)

    def center_window(self, width, height):
        # Get the screen width and height
        screen_width = self.winfo_screenwidth()
        screen_height = self.winfo_screenheight()

        # Calculate position x and y
        position_top = int(screen_height / 2 - height / 2)
        position_right = int(screen_width / 2 - width / 2)

        # Set the dimensions of the window and its position
        self.geometry(f'{width}x{height}+{position_right}+{position_top}')

#Show the Frame
    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

#Start Page
class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, bg='#333333')
        tk.Frame.__init__(self, parent, bg='#333333')
        label = ttk.Label(self, text='Fitness App', font=LARGEFONT, background='#333333')
        label.grid(row=3, column=4, padx=200, pady=100)
        button1 = ttk.Button(self, text='Begin', command=lambda: controller.show_frame(Page1),)
        button1.grid(row=4, column=4, padx=200, pady=10)

#Page 1
class Page1(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, bg='#333333')
        tk.Frame.__init__(self, parent, bg='#333333')
        label = ttk.Label(self, text='Athlete name:', font=('Courier', 15), background='#333333')
        label.grid(row=0, column=0, padx=275, pady=20)

        text_entry = ttk.Entry(self)
        text_entry.grid(row=1, column=0, pady=10)

        label = ttk.Label(self, text='height: in', font=('Courier', 15), background='#333333')
        label.grid(row=2, column=0, padx=275, pady=20)

        text_entry2 = ttk.Entry(self)
        text_entry2.grid(row=3, column=0, pady=10)

        label = ttk.Label(self, text='weight: lbs', font=('Courier', 15), background='#333333')
        label.grid(row=4, column=0, padx=275, pady=20)

        text_entry3 = ttk.Entry(self)
        text_entry3.grid(row=5, column=0, pady=10)


        button1 = ttk.Button(self, text='Continue', command=lambda: combined_command())
        button1.grid(row=7, column=0, padx=10, pady=50)
        button2 = ttk.Button(self, text='Restart', command=lambda: controller.show_frame(StartPage))
        button2.grid(row=8, column=0, padx=10, pady=10)

        def set_list():                                 #Save
            name = text_entry.get()                     #Data
            height = text_entry2.get()
            weight = text_entry3.get()

            data = [name, height, weight]
            h2 = int(height) * int(height)
            bmi = round((int(weight)/h2)*703, 1)
            judge = 0

            if bmi < 18.5:
                judge = 1
            elif bmi > 18.5 and bmi < 24.9:
                judge = 2
            elif bmi > 25.0 and bmi < 29.9:
                judge = 3
            elif bmi > 30.0 and bmi < 34.9:
                judge = 4
            elif bmi > 35.0:
                judge = 5

            return data, bmi, judge

        def combined_command():                         #Show
            data, bmi, judge = set_list()
            controller.show_frame(Page2)                #Next Page
            controller.frames[Page2].display_bmi(bmi, judge, data)


#Page 2
class Page2(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, bg='#333333')

        self.image = tk.PhotoImage(file='meter2.png')
        label_image = tk.Label(self, image=self.image, bg='#333333')
        label_image.grid(row=3, column=0, pady=60, padx=130)

        label = ttk.Label(self, text=f'BMI', font=LARGEFONT, background='#333333')
        label.grid(row=0, column=0, padx=10)

        self.bmi_label = ttk.Label(self, text='', font=('Courier', 15), background='#333333')
        self.bmi_label.grid(row=1, column=0, padx=10, pady=20)

        self.bmi_label2 = ttk.Label(self, text='', font=('Courier', 15), background='#333333')
        self.bmi_label2.grid(row=2, column=0, pady=20)

        button1 = ttk.Button(self, text='Page1', command=lambda: controller.show_frame(Page1))
        button1.grid(row=5, column=0, padx=10, pady=10)
        button2 = ttk.Button(self, text='Start Page', command=lambda: controller.show_frame(StartPage))
        button2.grid(row=6, column=0, padx=10, pady=10)

    def display_bmi(self, bmi, judge, data):
        self.bmi_label.config(text=f'Your BMI: {bmi}', foreground='white')

        if judge == 1:
            self.bmi_label2.config(text=f'{data[0]}, consider eating in a calorie surplus.', foreground='white')
        elif judge == 2:
            self.bmi_label2.config(text=f'Looking healthy, {data[0]}!', foreground='white')
        elif judge == 3:
            self.bmi_label2.config(text=f'{data[0]}, consider eating less.', foreground='white')
        elif judge == 4:
            self.bmi_label2.config(text=f'{data[0]}, you are obese. Eat less & work out.', foreground='white')
        elif judge == 5:
            self.bmi_label2.config(text=f'You are extremely obese.', foreground='red')


#App Loops
app = tkinterApp()
app.mainloop()