Add logging and refactored code

This commit is contained in:
William Valentin
2025-07-20 13:10:17 -07:00
parent a5791d8fe4
commit 351d3633fe

View File

@@ -9,11 +9,15 @@ import pandas as pd
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import sys
from dotenv import load_dotenv
from PIL import Image, ImageTk
from init import logger
from constants import LOG_LEVEL
class MedTrackerApp:
def __init__(self, root):
self.root = root
self.root.resizable(True, True)
self.root.title("Thechart - medication tracker")
@@ -24,14 +28,14 @@ class MedTrackerApp:
# self.root.geometry(f"{screen_width}x{screen_height}")
# self.root.configure(background='gold')
# self.root.lift()
self.filename = "thechart_data.csv"
# self.root.attributes("-topmost", True)
# self.root.geometry("800x600")
if len(sys.argv) > 1:
script_name = sys.argv[0]
first_argument = sys.argv[1]
if logger.level == logging.DEBUG:
if LOG_LEVEL == "DEBUG":
logger.debug(f"Script name: {script_name}")
logger.debug(f"First argument: {first_argument}")
@@ -44,6 +48,13 @@ class MedTrackerApp:
f" Using default file: {self.filename}"
)
make_icon(
app=self.root,
img="/home/will/Code/thechart/chart-671.png",
logger=logger,
)
self.filename = "thechart_data.csv"
self.initialize_csv()
main_frame = ttk.Frame(self.root, padding="10")
@@ -70,7 +81,11 @@ class MedTrackerApp:
)
self.anxiety_var = tk.IntVar()
ttk.Scale(
input_frame, from_=0, to=10, orient=tk.HORIZONTAL, variable=self.anxiety_var
input_frame,
from_=0,
to=10,
orient=tk.HORIZONTAL,
variable=self.anxiety_var,
).grid(row=1, column=1, sticky="ew")
ttk.Label(input_frame, text="Sleep Quality (0-10):").grid(
@@ -78,7 +93,11 @@ class MedTrackerApp:
)
self.sleep_var = tk.IntVar()
ttk.Scale(
input_frame, from_=0, to=10, orient=tk.HORIZONTAL, variable=self.sleep_var
input_frame,
from_=0,
to=10,
orient=tk.HORIZONTAL,
variable=self.sleep_var,
).grid(row=2, column=1, sticky="ew")
ttk.Label(input_frame, text="Appetite (0-10):").grid(
@@ -149,22 +168,24 @@ class MedTrackerApp:
row=6, column=0, sticky="w", padx=5, pady=2
)
self.date_var = tk.StringVar()
ttk.Entry(input_frame, textvariable=self.date_var, justify="center").grid(
row=6, column=1, sticky="ew", padx=5, pady=2
)
ttk.Entry(
input_frame, textvariable=self.date_var, justify="center"
).grid(row=6, column=1, sticky="ew", padx=5, pady=2)
button_frame = ttk.Frame(input_frame)
button_frame.grid(row=7, column=0, columnspan=2, pady=10)
ttk.Button(button_frame, text="Add Entry", command=self.add_entry).pack(
side="left", padx=5
)
ttk.Button(
button_frame, text="Add Entry", command=self.add_entry
).pack(side="left", padx=5, fill="both", expand=True)
ttk.Button(button_frame, text="Quit", command=self.on_closing).pack(
side="left", padx=5
)
# --- Table Frame ---
table_frame = ttk.LabelFrame(main_frame, text="Log (Double-click to edit)")
table_frame = ttk.LabelFrame(
main_frame, text="Log (Double-click to edit)"
)
table_frame.grid(row=1, column=1, padx=10, pady=10, sticky="nsew")
self.tree = ttk.Treeview(
@@ -217,7 +238,9 @@ class MedTrackerApp:
# --- Graph Frame ---
graph_frame = ttk.LabelFrame(main_frame, text="Evolution")
graph_frame.grid(row=0, column=0, columnspan=2, padx=10, pady=10, sticky="nsew")
graph_frame.grid(
row=0, column=0, columnspan=2, padx=10, pady=10, sticky="nsew"
)
self.fig, self.ax = plt.subplots()
self.canvas = FigureCanvasTkAgg(figure=self.fig, master=graph_frame)
@@ -263,28 +286,28 @@ class MedTrackerApp:
row=1, column=0, sticky="w", padx=5, pady=2
)
ttk.Scale(
edit_win, from_=1, to=10, variable=dep_var, orient=tk.HORIZONTAL
edit_win, from_=0, to=10, variable=dep_var, orient=tk.HORIZONTAL
).grid(row=1, column=1, sticky="ew")
ttk.Label(edit_win, text="Anxiety:").grid(
row=2, column=0, sticky="w", padx=5, pady=2
)
ttk.Scale(
edit_win, from_=1, to=10, variable=anx_var, orient=tk.HORIZONTAL
edit_win, from_=0, to=10, variable=anx_var, orient=tk.HORIZONTAL
).grid(row=2, column=1, sticky="ew")
ttk.Label(edit_win, text="Sleep:").grid(
row=3, column=0, sticky="w", padx=5, pady=2
)
ttk.Scale(
edit_win, from_=1, to=10, variable=slp_var, orient=tk.HORIZONTAL
edit_win, from_=0, to=10, variable=slp_var, orient=tk.HORIZONTAL
).grid(row=3, column=1, sticky="ew")
ttk.Label(edit_win, text="Appetite:").grid(
row=4, column=0, sticky="w", padx=5, pady=2
)
ttk.Scale(
edit_win, from_=1, to=10, variable=app_var, orient=tk.HORIZONTAL
edit_win, from_=0, to=10, variable=app_var, orient=tk.HORIZONTAL
).grid(row=4, column=1, sticky="ew")
ttk.Label(edit_win, text="Treatment:").grid(
@@ -329,12 +352,16 @@ class MedTrackerApp:
ttk.Label(edit_win, text="Note:").grid(
row=6, column=0, sticky="w", padx=5, pady=2
)
ttk.Entry(edit_win, textvariable=note_var).grid(row=6, column=1, sticky="ew")
ttk.Entry(edit_win, textvariable=note_var).grid(
row=6, column=1, sticky="ew"
)
ttk.Label(edit_win, text="Date:").grid(
row=7, column=0, sticky="w", padx=5, pady=2
)
ttk.Entry(edit_win, textvariable=date_var).grid(row=7, column=1, sticky="ew")
ttk.Entry(edit_win, textvariable=date_var).grid(
row=7, column=1, sticky="ew"
)
# Save and Cancel buttons
save_btn = ttk.Button(
@@ -356,7 +383,9 @@ class MedTrackerApp:
)
save_btn.grid(row=8, column=0, padx=5, pady=10)
cancel_btn = ttk.Button(edit_win, text="Cancel", command=edit_win.destroy)
cancel_btn = ttk.Button(
edit_win, text="Cancel", command=edit_win.destroy
)
cancel_btn.grid(row=8, column=1, padx=5, pady=10)
delete_btn = ttk.Button(
edit_win,
@@ -403,7 +432,9 @@ class MedTrackerApp:
df.to_csv(self.filename, index=False)
edit_win.destroy()
messagebox.showinfo("Success", "Entry updated successfully!", parent=self.root)
messagebox.showinfo(
"Success", "Entry updated successfully!", parent=self.root
)
self.clear_entries()
self.load_data()
@@ -451,7 +482,9 @@ class MedTrackerApp:
]
)
messagebox.showinfo("Success", "Entry added successfully!", parent=self.root)
messagebox.showinfo(
"Success", "Entry added successfully!", parent=self.root
)
self.clear_entries()
self.load_data()
@@ -494,7 +527,10 @@ class MedTrackerApp:
for i in self.tree.get_children():
self.tree.delete(i)
if os.path.exists(self.filename) and os.path.getsize(self.filename) > 0:
if (
os.path.exists(self.filename)
and os.path.getsize(self.filename) > 0
):
try:
df = pd.read_csv(
self.filename,
@@ -529,16 +565,28 @@ class MedTrackerApp:
df["depression"],
marker="o",
linestyle="-",
label="Depression",
label="Depression (0:good, 10:bad)",
)
self.ax.plot(
df.index, df["anxiety"], marker="o", linestyle="-", label="Anxiety"
df.index,
df["anxiety"],
marker="o",
linestyle="-",
label="Anxiety (0:good, 10:bad)",
)
self.ax.plot(
df.index, df["sleep"], marker="o", linestyle="-", label="Sleep"
df.index,
df["sleep"],
marker="o",
linestyle="dashed",
label="Sleep (0:bad, 10:good)",
)
self.ax.plot(
df.index, df["appetite"], marker="o", linestyle="-", label="Appetite"
df.index,
df["appetite"],
marker="o",
linestyle="dashed",
label="Appetite (0:bad, 10:good)",
)
self.ax.legend()
self.ax.set_title("Medication Effects Over Time")
@@ -548,31 +596,20 @@ class MedTrackerApp:
self.canvas.draw()
def setup_logging() -> logging.Logger:
load_dotenv()
log_file = os.getenv("LOG_FILE", "/tmp/thechart.log")
if not os.path.exists(os.path.dirname(log_file)):
os.makedirs(os.path.dirname(log_file), exist_ok=True)
log_level = os.getenv("LOG_LEVEL", "INFO").upper()
if log_level not in ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]:
log_level = "DEBUG"
logging.basicConfig(
level=getattr(logging, log_level),
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler(log_file),
logging.StreamHandler(sys.stdout),
],
)
logger = logging.getLogger()
return logger
def make_icon(app: tk.Tk, img: str, logger: logging.Logger) -> None:
try:
icon_image = Image.open(img)
icon_image = icon_image.resize(
size=(32, 32), resample=Image.Resampling.NEAREST
)
icon_photo = ImageTk.PhotoImage(image=icon_image)
app.iconphoto(True, icon_photo)
app.wm_iconphoto(True, icon_photo)
except FileNotFoundError:
logger.warning("Icon file not found.")
if __name__ == "__main__":
logger = setup_logging()
root = tk.Tk()
app = MedTrackerApp(root)
root.mainloop()