diff --git a/frontend/app.py b/frontend/app.py index 9a802cf..e93ac30 100644 --- a/frontend/app.py +++ b/frontend/app.py @@ -7,12 +7,13 @@ from statistics import mean from .serial_reader import SerialReader from .config import DEFAULT_CALIB, DISPLAY_TYPES -from .views import NumberView +from .views import * class WeightApp(tk.Tk): def __init__(self, weight_reader: SerialReader): super().__init__() self.weight_reader = weight_reader + self.view = None self.toolbar = tk.Frame(self, padx=10) self.toolbar.pack(side=tk.LEFT) @@ -51,9 +52,11 @@ class WeightApp(tk.Tk): self.view_type.pack() self.view_type_label = ttk.Label(self.view_type, text="Visual:") self.view_type_label.pack(side=tk.LEFT) - self.view_type_select = ttk.Combobox(self.view_type, values=[t.value for t in DISPLAY_TYPES], postcommand=self.update_view) + self.view_type_select = ttk.Combobox(self.view_type, values=[t.value for t in DISPLAY_TYPES]) self.view_type_select.set(DISPLAY_TYPES.NUMBER.value) self.view_type_select.pack(side=tk.LEFT) + self.view_type_update = ttk.Button(self.view_type, text="Refresh", command=self.update_view) + self.view_type_update.pack() #### Display #### self.update_view() @@ -109,12 +112,23 @@ class WeightApp(tk.Tk): def update_view(self): selected_view = self.view_type_select.get() + + if self.view is not None: + self.view.pack_forget() + + if selected_view == DISPLAY_TYPES.NUMBER.value: self.view = NumberView(self, tare_command=self.weight_reader.tare, calibrate_command=self.calibrate, padx=50) self.view.pack(side=tk.RIGHT) + elif selected_view == DISPLAY_TYPES.CIRCLE.value: + self.view = CircleView(self, + tare_command=self.weight_reader.tare, + calibrate_command=self.calibrate, + padx=50) + self.view.pack(side=tk.RIGHT) else: raise Exception(f"View {selected_view} not found.") diff --git a/frontend/config.py b/frontend/config.py index 806d5f5..02d5e47 100644 --- a/frontend/config.py +++ b/frontend/config.py @@ -11,4 +11,5 @@ MOV_AVG_DEFAULTS = { } class DISPLAY_TYPES(Enum): - NUMBER = 'number' \ No newline at end of file + NUMBER = 'number' + CIRCLE = 'circle' \ No newline at end of file diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 63ffeb6..b5728b9 100644 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -1 +1,2 @@ -from .number import NumberView \ No newline at end of file +from .number import NumberView +from .circle import CircleView \ No newline at end of file diff --git a/frontend/views/base.py b/frontend/views/base.py index 4f4a3fe..5145e2b 100644 --- a/frontend/views/base.py +++ b/frontend/views/base.py @@ -15,6 +15,8 @@ class View(Frame): self.canvas = Canvas(self, width=144, height=168, background='white') self.canvas.pack() + self.center = (144 // 2, 168 // 2) + self._init_canvas() def _init_canvas(self): diff --git a/frontend/views/circle.py b/frontend/views/circle.py new file mode 100644 index 0000000..be9d7ff --- /dev/null +++ b/frontend/views/circle.py @@ -0,0 +1,45 @@ +import tkinter as tk +from tkinter import ttk + +from .base import View + +class CircleView(View): + + def _init_canvas(self): + self.target_r = self.center[0] - 10 + self.draw_circle(self.center[0], self.center[1], + self.target_r, + outline="#000000") + + self.target_frame = tk.Frame(self.actions) + self.target_frame.pack() + self.target_label = ttk.Label(self.target_frame, text="Target (g)") + self.target_label.pack(side=tk.LEFT) + self.target = ttk.Entry(self.target_frame) + self.target.insert(0, 100.0) + self.target.pack(side=tk.LEFT) + + def draw_circle(self, x, y, r, **kwargs): + self.canvas.create_oval(x-r, y-r, x+r, y+r, **kwargs) + + def update_weight(self, weight): + self.canvas.delete("all") + + weight_r = 0.0 + try: + target = float(self.target.get()) + weight_r = weight / target * self.target_r + + self.draw_circle(self.center[0], self.center[1], + weight_r, + fill="#000000") + except: + pass + finally: + target_outline = "#000000" + if weight_r > self.target_r: + target_outline = "#FFFFFF" + self.draw_circle(self.center[0], self.center[1], + self.target_r, + outline=target_outline) +