import flet as ft import file_handler from datetime import datetime from random import choice def get_time(): t = datetime.now() return [t.year, t.month, t.day, t.hour, t.minute, t.second] def random_emoji(): return choice("๐ŸŽ๐Ÿ๐ŸŠ๐Ÿ‹๐ŸŒ๐Ÿ‰๐Ÿ‡๐Ÿ“๐Ÿˆ๐Ÿ’๐Ÿ‘๐Ÿ๐Ÿฅ๐Ÿฅญ๐Ÿฅ‘๐Ÿ…๐Ÿ†๐Ÿฅ’๐Ÿฅ•๐Ÿฅฌ๐ŸŒฝ๐Ÿฅ”๐Ÿ ๐ŸŒฐ๐Ÿฅœ๐Ÿฏ๐Ÿฅ๐Ÿž๐Ÿฅ–๐Ÿฅจ๐Ÿฅฏ๐Ÿง€๐Ÿฅš๐Ÿณ๐Ÿฅ“๐Ÿง„๐Ÿง…๐Ÿฅž๐Ÿง‡๐Ÿค๐Ÿ—๐Ÿ–๐Ÿ•๐ŸŒญ๐Ÿ”๐ŸŸ๐Ÿฅ™๐ŸŒฎ๐ŸŒฏ๐Ÿฅ—๐Ÿฅ˜๐Ÿ๐Ÿœ๐Ÿฆช๐Ÿฒ๐Ÿฅ๐Ÿฃ๐Ÿฑ๐Ÿ›๐Ÿš๐Ÿง†๐Ÿ™๐Ÿ˜๐Ÿข๐Ÿก๐Ÿง๐Ÿจ๐Ÿฆ๐Ÿฐ๐ŸŽ‚๐Ÿฎ๐Ÿญ๐Ÿฌ๐Ÿซ๐Ÿฟ๐Ÿฉ๐Ÿช๐Ÿฅฎ๐Ÿง๐Ÿฅ›๐Ÿงˆ๐Ÿผโ˜•๐Ÿต๐Ÿถ๐Ÿบ๐Ÿป๐Ÿฅ‚๐Ÿท๐Ÿฅƒ๐Ÿธ๐Ÿน๐Ÿพ๐Ÿง‰๐Ÿงƒ๐ŸงŠ๐Ÿง‚๐Ÿฅ„๐Ÿด") class Nahrung(ft.UserControl): def __init__(self) -> None: super().__init__() self.settings, self.history = file_handler.load(self) self.kjtext = ft.Text("0", size=25) self.kcaltext = ft.Text("0", size=30) self.kcaltextfield = ft.TextField(keyboard_type="NUMBER",expand=True,autofocus=True,on_change=self.reseterrorinkcaltextfield,on_submit=self.editkcal) # Initialize history list self.historylist = [] self.update_history() # Initialize controls self.main_container = ft.Container( content=ft.Column( [ ft.Row( [ ft.Text("kjoule:", size=20), self.kjtext, ft.Text(f"/{round(self.settings['kcal_max'] * 4.184, 0)}", size=10) ] ), ft.Row( [ ft.Text("kcal:", size=25), self.kcaltext, ft.Text(f"/{self.settings['kcal_max']}", size=10) ] ), ft.Row( [ self.kcaltextfield, ft.FloatingActionButton(icon="add", on_click=self.editkcal) ] ), ] ), bgcolor=ft.colors.INDIGO_400, border_radius=10, padding=15, ) self.history_container = ft.Container( content=ft.Column([ft.Text("Verlauf:"), ft.Column(controls=self.historylist) ]), ) self.controls = [self.main_container, self.history_container] self.load_todays_kcal() def reseterrorinkcaltextfield(self): self.kcaltextfield.error_text = "" def build(self): self.kjtext.value = str(round(int(self.kcaltext.value) * 4.184, 0)) return ft.Column(self.controls) def editkcal(self, e): try: emoji = random_emoji() print(emoji,ord(emoji)) new_kcal = int(self.kcaltext.value) + int(self.kcaltextfield.value) self.kcaltext.value = str(new_kcal) self.kjtext.value = str(round(new_kcal * 4.184, 0)) self.history.append([emoji, self.kcaltextfield.value, get_time()]) file_handler.save(self.settings, self.history) # Save the updated kcal value self.update_history() self.reseterrorinkcaltextfield() self.kcaltextfield.value = "" self.update() # Update the controls to reflect changes except ValueError: print("error") self.kcaltextfield.error_text = "\\(*O*)/ nicht verschreiben!!" self.update() #pass # Handle invalid input gracefully def create_appbar(self): return ft.AppBar( title=ft.Text("Nahrungstracker"), actions=[ ft.PopupMenuButton( items=[ft.PopupMenuItem(text="Reset", on_click=self.resethistory)] ) ], ) def update_history(self): self.historylist.clear() for h in self.history: self.historylist.insert(0, ft.Container(content= ft.Column(controls=[ ft.Row( [ft.Text(str(f"{h[2][3]}:{h[2][4]}:{h[2][5]} {h[2][2]}.{h[2][1]}.{h[2][0]}"))], alignment=ft.MainAxisAlignment.END ), ft.Row( [ft.Text(str(f"({h[1]} kcal) {h[0]}"), size=20)], alignment=ft.MainAxisAlignment.START, )]), bgcolor=ft.colors.INDIGO_600, # "#226666", border_radius=5, padding=6 ) ) def resethistory(self, e): print("pressed") def reset(e): self.kcaltext.value = "0" self.kjtext.value = "0" self.history = [] file_handler.save(self.settings, self.history) self.update_history() self.history_container.content = ft.Column(self.historylist) self.dialog.open = False # beide updaten self.page.update() self.update() def close(e): self.dialog.open = False # beide updaten self.page.update() self.update() self.dialog = ft.AlertDialog( modal=True, title=ft.Text("Wirklich?"), content=ft.Text("Alle Daten werden aus deinem Verlauf gelรถscht!!!"), actions=[ ft.TextButton("ja", on_click=reset), ft.TextButton("nein", on_click=close), ], actions_alignment=ft.MainAxisAlignment.END, on_dismiss=lambda e: print("Modal dialog dismissed!"), ) self.page.dialog = self.dialog self.dialog.open = True self.page.update() def load_todays_kcal(self): today_date = get_time()[:3] print(today_date) todays_kcal = 0 for entry in self.history: entry_date = entry[2][:3] # Year, Month, Day part of the entry's timestamp if entry_date == today_date: todays_kcal += int(entry[1]) self.kcaltext.value = str(todays_kcal) def main(page: ft.Page): page.title = "Nahrungstracker" page.scroll = True nahrung = Nahrung() nahrung.page = page # Store reference to the page in Nahrung instance page.appbar = nahrung.create_appbar() page.add(nahrung) page.update() # Ensure the initial UI is updated if __name__ == "__main__": ft.app(target=main)