Add logging and refactored code
This commit is contained in:
137
src/main.py
137
src/main.py
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user