I am very new to Python (yes, I know it's been around a long time). This is my first working just-for-fun project to see if I could do something in Python. I know the UI layout is rather ugly and there is probably a more efficient way to write the code. This is not built for mobile applications because I am not that far into learning Python yet.
import tkinter as tk
from tkinter import ttk
class CostSharingApp:
def __init__(self, root):
self.root = root
self.root.title("Cost Sharing Application")
self.root.geometry("400x600")
self.root.configure(bg="#f0f8ff")
# Main container with scrollbar
self.canvas = tk.Canvas(root, bg="#e0f7fa", highlightthickness=0)
self.scrollbar = ttk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
self.scrollable_frame = ttk.Frame(self.canvas, padding=(0, 0, 10, 10))
self.scrollable_frame.bind(
"<Configure>",
lambda e: self.canvas.configure(
scrollregion=self.canvas.bbox("all")
)
)
self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.canvas.pack(side="left", fill="both", expand=True)
self.scrollbar.pack(side="right", fill="y")
# Input field for total cost
self.label_total_cost = tk.Label(self.scrollable_frame, text="Total Cost (USD):", bg="#e0f7fa")
self.label_total_cost.pack(pady=(20, 5))
self.entry_total_cost = tk.Entry(self.scrollable_frame)
self.entry_total_cost.pack(pady=5)
# Dropdown for number of people
self.label_num_people = tk.Label(self.scrollable_frame, text="Number of People:", bg="#e0f7fa")
self.label_num_people.pack(pady=(10, 5))
self.num_people = ttk.Combobox(self.scrollable_frame, values=[1, 2, 3, 4, 5, 6])
self.num_people.current(0)
self.num_people.pack(pady=5)
# Divide Evenly button
self.btn_divide_evenly = tk.Button(self.scrollable_frame, text="Divide Evenly", bg="#4caf50", fg="white", command=self.divide_evenly)
self.btn_divide_evenly.pack(pady=10)
# Enter Manually button
self.btn_enter_manually = tk.Button(self.scrollable_frame, text="Enter Manually", bg="#4caf50", fg="white", command=self.enter_manually)
self.btn_enter_manually.pack(pady=10)
# Output field for total due
self.label_total_due = tk.Label(self.scrollable_frame, text="Total Due (USD per person):", bg="#e0f7fa")
self.label_total_due.pack(pady=(10, 5))
self.entry_total_due = tk.Entry(self.scrollable_frame, state="readonly")
self.entry_total_due.pack(pady=5)
# Container for manual entries
self.manual_entries_container = tk.Frame(self.scrollable_frame, bg="#e0f7fa")
self.manual_entries_container.pack(pady=(10, 20))
# Submit button
self.btn_submit = tk.Button(self.scrollable_frame, text="Submit", bg="#4caf50", fg="white", command=self.submit)
self.btn_submit.pack(pady=(10, 20))
# Result display
self.result_container = tk.Frame(self.scrollable_frame, bg="#e0f7fa")
self.result_container.pack(pady=10)
def divide_evenly(self):
total_cost = float(self.entry_total_cost.get())
num_people = int(self.num_people.get())
total_due = round(total_cost / num_people, 2)
self.entry_total_due.config(state="normal")
self.entry_total_due.delete(0, tk.END)
self.entry_total_due.insert(0, f"${total_due}")
self.entry_total_due.config(state="readonly")
def enter_manually(self):
for widget in self.manual_entries_container.winfo_children():
widget.destroy()
num_people = int(self.num_people.get())
self.manual_entries = []
for _ in range(num_people):
frame = tk.Frame(self.manual_entries_container, bg="#e0f7fa")
frame.pack(pady=5)
name_entry = tk.Entry(frame, width=25)
name_entry.pack(side="left", padx=(0, 10))
amount_entry = tk.Entry(frame, width=10)
amount_entry.pack(side="left")
self.manual_entries.append((name_entry, amount_entry))
def submit(self):
for widget in self.result_container.winfo_children():
widget.destroy()
for name_entry, amount_entry in self.manual_entries:
name = name_entry.get()
amount = amount_entry.get()
if name and amount:
label = tk.Label(self.result_container, text=f"{name}: ${amount}", bg="#e0f7fa")
label.pack(anchor="w")
if __name__ == "__main__":
root = tk.Tk()
app = CostSharingApp(root)
root.mainloop()