From 2c2933f0cbb72a5d81a26a6948e9e8bbdf093c06 Mon Sep 17 00:00:00 2001 From: Jannes Date: Sun, 27 Apr 2025 14:30:40 +0200 Subject: [PATCH] add view class --- frontend/app.py | 56 ++++++++++++++++++++------------------ frontend/views/__init__.py | 1 + frontend/views/base.py | 24 ++++++++++++++++ frontend/views/number.py | 9 ++++++ 4 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 frontend/views/__init__.py create mode 100644 frontend/views/base.py create mode 100644 frontend/views/number.py diff --git a/frontend/app.py b/frontend/app.py index 2c86ec8..0654b9a 100644 --- a/frontend/app.py +++ b/frontend/app.py @@ -4,11 +4,12 @@ import threading from .serial_reader import WeightReader from .config import DEFAULT_CALIB, DISPLAY_TYPES +from .views import NumberView class WeightApp(tk.Tk): - def __init__(self, weight_reader): + def __init__(self, weight_reader: WeightReader): super().__init__() - self.weight_reader: WeightReader = weight_reader + self.weight_reader = weight_reader self.toolbar = tk.Frame(self, padx=10) self.toolbar.pack(side=tk.LEFT) @@ -43,29 +44,17 @@ class WeightApp(tk.Tk): self.update_calib_button = ttk.Button(self.reader_settings, text="Update Calibration", command=self.update_calib) self.update_calib_button.pack() - self.display_type = tk.Frame(self.toolbar, pady=20) - self.display_type.pack() - self.display_type_label = ttk.Label(self.display_type, text="Visual:") - self.display_type_label.pack(side=tk.LEFT) - self.display_type_select = ttk.Combobox(self.display_type, values=[t.value for t in DISPLAY_TYPES]) - self.display_type_select.set(DISPLAY_TYPES.NUMBER.value) - self.display_type_select.pack(side=tk.LEFT) + self.view_type = tk.Frame(self.toolbar, pady=20) + 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], command=self.update_view) + self.view_type_select.set(DISPLAY_TYPES.NUMBER.value) + self.view_type_select.pack(side=tk.LEFT) + - #### Display #### - self.main_frame = tk.Frame(self, width=144, height=168, padx=50) - self.main_frame.pack(side=tk.RIGHT) - - #### Actions #### - self.actions = tk.Frame(self.main_frame) - self.actions.pack() - self.tare_button = ttk.Button(self.actions, text="Tare", command=self.weight_reader.tare) - self.tare_button.pack() - - self.canvas = tk.Canvas(self.main_frame, width=144, height=168, background='white') - self.canvas.pack() - - self.label = self.canvas.create_text(50, 68, text="0.0 g", font=("Arial", 18), fill='black', justify='left') + self.update_view() self.update_weight_display() @@ -83,11 +72,11 @@ class WeightApp(tk.Tk): self.connect_button.config(text="Connect") self.connect_button.pack_forget() self.reader_settings.pack_forget() - self.actions.pack_forget() + self.view.actions.pack_forget() self.connection_settings.pack() self.connect_button.pack() self.reader_settings.pack() - self.actions.pack() + self.view.pack() def update_devices(self): self.weight_reader.scan_devices() @@ -97,12 +86,25 @@ class WeightApp(tk.Tk): def update_calib(self): self.weight_reader.calib_factor = self.calib_weight.get() / float(self.calib_measurements.get()) - + def update_view(self): + selected_view = self.view_type_select.get() + if selected_view == DISPLAY_TYPES.NUMBER: + self.view = NumberView(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.") + def update_weight_display(self): weight = self.weight_reader.value - self.canvas.itemconfig(self.label, text=f"{weight:.1f} g") + self.view.update_weight(weight) self.after(100, self.update_weight_display) + + def calibrate(self): + ... def main(): weight_reader = WeightReader() diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py new file mode 100644 index 0000000..63ffeb6 --- /dev/null +++ b/frontend/views/__init__.py @@ -0,0 +1 @@ +from .number import NumberView \ No newline at end of file diff --git a/frontend/views/base.py b/frontend/views/base.py new file mode 100644 index 0000000..0bd96e0 --- /dev/null +++ b/frontend/views/base.py @@ -0,0 +1,24 @@ +from tkinter import ttk, Frame, Canvas + +class View(Frame): + + def __init__(self, *args, tare_command=None, calibrate_command=None, **kwargs): + super().__init__(*args, **kwargs) + + self.actions = Frame(self) + self.actions.pack() + # self.calibrate_button = ttk.Button(self.actions, text="Calibrate", command=calibrate_command) + # self.calibrate_button.pack() + self.tare_button = ttk.Button(self.actions, text="Tare", command=tare_command) + self.tare_button.pack() + + self.canvas = Canvas(self, width=144, height=168, background='white') + self.canvas.pack() + + self._init_canvas() + + def _init_canvas(self): + raise NotImplementedError() + + def update_weight(self, weight: float): + raise NotImplementedError() diff --git a/frontend/views/number.py b/frontend/views/number.py new file mode 100644 index 0000000..701c025 --- /dev/null +++ b/frontend/views/number.py @@ -0,0 +1,9 @@ +from .base import View + +class NumberView(View): + + def _init_canvas(self): + self.label = self.canvas.create_text(50, 68, text="0.0 g", font=("Arial", 18), fill='black', justify='left') + + def update_weight(self, weight): + self.canvas.itemconfig(self.label, text=f"{weight:.1f} g")