-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfitnessTrackerApp.py
315 lines (241 loc) · 12.6 KB
/
fitnessTrackerApp.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
import tkinter as tk
from views import Startview, Userview, Trainingview, Trainingrecordview, Mealview, Mealrecordview, Weightview, Weightrecordview
from datetime import datetime
from database import Database
from user_meal_activity_weight import *
from tkinter import ttk
from ttkthemes import ThemedStyle
class FitnessTrackerApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# Titel
self.title("Fit4Fun")
self.geometry('1080x720')
self.resizable(False, True)
# SQLite-Datenbankverbindung herstellen
self.db = Database()
self.db.create_tables()
# Kopfleiste
self.button = tk.Button(self, text="←", command=lambda: self.show_frame("sv"))
self.title_label = tk.Label(self, text="", font=('Helvetica', 18, 'bold'))
self.placeholder = tk.Label(self, text="")
self.button.grid(row=0, column=0)
self.title_label.grid(row=0, column=1)
self.placeholder.grid(row=0, column=2)
self.grid_rowconfigure(0, minsize=60)
self.grid_columnconfigure(0, weight=0, minsize=200)
self.grid_columnconfigure(1, weight=10)
self.grid_columnconfigure(2, weight=0, minsize=200)
self.separator = ttk.Separator(self, orient='horizontal')
self.separator.grid(row=1, column=0, columnspan=3, sticky="ew")
# self.container wird erstellt, der alle Frames beinhaltet
self.container = tk.Frame(self)
self.container.grid(row=3, column=0, columnspan=3, sticky="nsew")
self.container.grid_rowconfigure(0, weight=1)
self.container.grid_columnconfigure(0, weight=1, minsize=1080)
# Liste der Frames
self.frames = {}
# View Objekte erzeugen und in den Frame packen
self.Startview = Startview(parent=self.container, controller=self)
self.Userview = Userview(parent=self.container, controller=self)
self.Trainingview = Trainingview(parent=self.container, controller=self)
self.Trainingrecordview = Trainingrecordview(parent=self.container, controller=self)
self.Mealview = Mealview(parent=self.container, controller=self)
self.Mealrecordview = Mealrecordview(parent=self.container, controller=self)
self.Weightview = Weightview(parent=self.container, controller=self)
self.Weightrecordview = Weightrecordview(parent=self.container, controller=self)
self.frames['sv'] = self.Startview
self.frames['uv'] = self.Userview
self.frames['tv'] = self.Trainingview
self.frames['trv'] = self.Trainingrecordview
self.frames['mv'] = self.Mealview
self.frames['mrv'] = self.Mealrecordview
self.frames['wv'] = self.Weightview
self.frames['wrv'] = self.Weightrecordview
#Styles werden gesetzt
for x in self.frames:
style = ThemedStyle(self.frames.get(x))
style.set_theme("equilux")
self.Startview.grid(row=3, column=0, sticky="nsew")
self.Userview.grid(row=3, column=0, sticky="nsew")
self.Trainingview.grid(row=3, column=0, sticky="nsew")
self.Trainingrecordview.grid(row=3, column=0, sticky="nsew")
self.Mealview.grid(row=3, column=0, sticky="nsew")
self.Mealrecordview.grid(row=3, column=0, sticky="nsew")
self.Weightview.grid(row=3, column=0, sticky="nsew")
self.Weightrecordview.grid(row=3, column=0, sticky="nsew")
# Zuerst Startview anzeigen
self.show_frame("sv")
print(vars(self.frames.get('sv')))
# Button funktionen mappen
self.map_button_functions()
# Funktion, die eine View in einem Frame im Cointainer an die Top Positioon bringt
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
self.title_label.config(text= frame.title)
if page_name=='sv':
self.button.grid_forget()
else:
self.button.grid(row=0, column=0)
frame.show()
frame.tkraise()
def record_user(self):
name = self.Userview.name_entry.get()
age = self.Userview.age_entry.get()
weight = self.Userview.weight_entry.get()
fl = self.Userview.fl_entry.get()
connection = self.db.get_connection()
cursor = connection.cursor()
print(weight)
# Überprüfen, ob die Eingabe eine positive Zahl ist
try:
weight = float(weight)
if weight <= 0:
raise ValueError("Das Gewicht muss eine positive Zahl sein.")
except ValueError:
self.Startview.message_Label.configure(text="Bitte geben Sie eine gültige Gewichtsangabe ein.",
foreground="red")
return
# Gewichtsverlauf in die Datenbank einfügen
cursor.execute("INSERT INTO user (name, age, weight, fl) VALUES (?,?,?,?)", (name, age, weight, fl))
# Meldung anzeigen, dass das Gewicht erfolgreich aufgezeichnet wurde
self.Userview.message_Label.configure(text=f"Hallo {name}, es kann losgehen",
foreground="green")
# Aktuelles Datum und Uhrzeit abrufen
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Gewichtsverlauf in die Datenbank einfügen
cursor.execute("INSERT INTO weight_logs (weight, date) VALUES (?, ?)", (weight, current_date))
cursor.execute("SELECT * FROM user")
users = cursor.fetchall()
connection.commit()
print(users)
def record_workout(self):
connection = self.db.get_connection()
cursor = connection.cursor()
# Eingabewerte vom Benutzer abrufen
name = self.Trainingrecordview.workout_entry.get()
duration = self.Trainingrecordview.duration_entry.get()
# Überprüfen, ob die Eingaben nicht leer sind
if name == "":
# Zeige eine Meldung an, dass das Feld nicht leer sein darf
self.Trainingrecordview.message_Label.configure(text='Bitte Training eingeben', foreground='red')
return
if duration == "":
# Zeige eine Meldung an, dass das Feld nicht leer sein darf
self.Trainingrecordview.message_Label.configure(text='Bitte Länge Trainings eingeben', foreground='red')
return
activity = Activity(name, duration)
# Kalorien berechnen
calories = activity.calories
print(calories)
# Aktuelles Datum und Uhrzeit abrufen
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Trainingsaktivität in die Datenbank schreiben
cursor.execute("INSERT INTO workouts (activity, duration, calories, date) VALUES (?, ?, ?, ?)", (name, int(duration), int(calories), current_date))
# Meldung anzeigen, dass die Trainingsaktivität erfolgreich aufgezeichnet wurde
self.Trainingrecordview.message_Label.configure(
text=f"Trainingsaktivität '{name}' erfolgreich aufgezeichnet.",
foreground="green")
cursor.execute("SELECT activity, date FROM workouts ORDER BY date DESC")
workouts = cursor.fetchall()
print(workouts)
connection.commit()
def record_meal(self):
# Eingabewerte vom Benutzer abrufen
first = self.Mealrecordview.first_combo.get()
second = self.Mealrecordview.second_combo.get()
drink = self.Mealrecordview.drink_combo.get()
# Meal aus Klasse erstellen
meal = Meal()
meal.first = Meal.first[self.Mealrecordview.first_combo.current()]
meal.second = Meal.second[self.Mealrecordview.second_combo.current()]
meal.drink = Meal.drink[self.Mealrecordview.drink_combo.current()]
meal.fq = int(self.Mealrecordview.first_x_entry.get())
meal.sq = int(self.Mealrecordview.second_x_entry.get())
meal.dq = int(self.Mealrecordview.drink_x_entry.get())
connection = self.db.get_connection()
cursor = connection.cursor()
# Überprüfen, ob die Eingabe nicht leer ist
if first != 'Bitte wählen' and meal.fq == 0:
# Zeige eine Meldung an, dass das Feld nicht leer sein darf
self.Mealrecordview.message_Label.configure(
text="Bitte geben Sie die Menge des Hauptgerichtes in Gramm ein.", foreground="red")
return
if second != 'Bitte wählen' and meal.sq == 0:
# Zeige eine Meldung an, dass das Feld nicht leer sein darf
self.Mealrecordview.message_Label.configure(
text="Bitte geben Sie die Menge der Beilage in Gramm ein.", foreground="red")
return
if drink != 'Bitte wählen' and meal.dq == 0:
# Zeige eine Meldung an, dass das Feld nicht leer sein darf
self.Mealrecordview.message_Label.configure(
text="Bitte geben Sie die Menge des Getränks in Gramm ein.", foreground="red")
return
if first == second == drink == "Bitte wählen":
self.Mealrecordview.message_Label.configure(
text="Bitte geben sie mindestens ein Gericht oder Getränk ein.", foreground="red")
return
if first == 'Bitte wählen':
first = ''
if second == 'Bitte wählen':
second = ''
if drink == 'Bitte wählen':
drink = ''
# Eingabewerte vom Benutzer abrufen
calories = meal.count_cals()
# Aktuelles Datum und Uhrzeit abrufen
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Mahlzeit in die Datenbank einfügen
cursor.execute("INSERT INTO meals (meal_name, calories, date) VALUES (?, ?, ?)",
(first + ' ' + second + ' ' + drink, calories, current_date))
# Meldung anzeigen, dass die Mahlzeit erfolgreich aufgezeichnet wurde
self.Mealrecordview.message_Label.configure(
text=f"Mahlzeit {first} {second} {drink} mit {calories} Kalorien erfolgreich aufgezeichnet.",
foreground="green")
connection.commit()
def record_weight(self):
# Eingabewerte vom Benutzer abrufen
weight = self.Weightrecordview.weight_entry.get()
connection = self.db.get_connection()
cursor = connection.cursor()
print(weight)
# Überprüfen, ob die Eingabe eine positive Zahl ist
try:
weight = float(weight)
if weight <= 0:
raise ValueError("Das Gewicht muss eine positive Zahl sein.")
except ValueError:
self.Weightrecordview.message_Label.configure(text="Bitte geben Sie eine gültige Gewichtsangabe ein.",
foreground="red")
return
# Aktuelles Datum und Uhrzeit abrufen
current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Gewichtsverlauf in die Datenbank einfügen
cursor.execute("INSERT INTO weight_logs (weight, date) VALUES (?, ?)", (weight, current_date))
# Meldung anzeigen, dass das Gewicht erfolgreich aufgezeichnet wurde
self.Weightrecordview.message_Label.configure(text=f"Gewicht {weight} kg erfolgreich aufgezeichnet.",
foreground="green")
# Eingabefelder leeren
self.Weightrecordview.weight_entry.delete(0, tk.END)
cursor.execute("SELECT weight, date FROM weight_logs ORDER BY date DESC")
weight_logs = cursor.fetchall()
connection.commit()
print(weight_logs)
# Hier werden alle Funktionen allen Buttons aller Views zugeordnet
def map_button_functions(self):
# Mapping der Funktionen in der Startview
self.Startview.show_workout_button.configure(command=lambda: self.show_frame("tv"))
self.Startview.record_workout_button.configure(command=lambda: self.show_frame("trv"))
self.Startview.show_meal_button.configure(command=lambda: self.show_frame('mv'))
self.Startview.record_meal_button.configure(command=lambda: self.show_frame('mrv'))
self.Startview.show_weight_button.configure(command=lambda: self.show_frame('wv'))
self.Startview.record_weight_button.configure(command=lambda: self.show_frame('wrv'))
# Mapping der Funktionen in allen anderen Views
self.Userview.create_user_button.configure(command=self.record_user)
self.Trainingrecordview.safe_workout_button.configure(command=self.record_workout)
self.Mealrecordview.record_meal_button.configure(command=self.record_meal)
self.Weightrecordview.safe_weight_button.configure(command=self.record_weight)
if __name__ == "__main__":
app = FitnessTrackerApp()
app.mainloop()