add circleview

This commit is contained in:
2025-05-05 23:37:07 +02:00
parent f13149002f
commit 3e168d2074
5 changed files with 67 additions and 4 deletions

View File

@@ -7,12 +7,13 @@ from statistics import mean
from .serial_reader import SerialReader from .serial_reader import SerialReader
from .config import DEFAULT_CALIB, DISPLAY_TYPES from .config import DEFAULT_CALIB, DISPLAY_TYPES
from .views import NumberView from .views import *
class WeightApp(tk.Tk): class WeightApp(tk.Tk):
def __init__(self, weight_reader: SerialReader): def __init__(self, weight_reader: SerialReader):
super().__init__() super().__init__()
self.weight_reader = weight_reader self.weight_reader = weight_reader
self.view = None
self.toolbar = tk.Frame(self, padx=10) self.toolbar = tk.Frame(self, padx=10)
self.toolbar.pack(side=tk.LEFT) self.toolbar.pack(side=tk.LEFT)
@@ -51,9 +52,11 @@ class WeightApp(tk.Tk):
self.view_type.pack() self.view_type.pack()
self.view_type_label = ttk.Label(self.view_type, text="Visual:") self.view_type_label = ttk.Label(self.view_type, text="Visual:")
self.view_type_label.pack(side=tk.LEFT) 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.set(DISPLAY_TYPES.NUMBER.value)
self.view_type_select.pack(side=tk.LEFT) 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 #### #### Display ####
self.update_view() self.update_view()
@@ -109,12 +112,23 @@ class WeightApp(tk.Tk):
def update_view(self): def update_view(self):
selected_view = self.view_type_select.get() selected_view = self.view_type_select.get()
if self.view is not None:
self.view.pack_forget()
if selected_view == DISPLAY_TYPES.NUMBER.value: if selected_view == DISPLAY_TYPES.NUMBER.value:
self.view = NumberView(self, self.view = NumberView(self,
tare_command=self.weight_reader.tare, tare_command=self.weight_reader.tare,
calibrate_command=self.calibrate, calibrate_command=self.calibrate,
padx=50) padx=50)
self.view.pack(side=tk.RIGHT) 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: else:
raise Exception(f"View {selected_view} not found.") raise Exception(f"View {selected_view} not found.")

View File

@@ -12,3 +12,4 @@ MOV_AVG_DEFAULTS = {
class DISPLAY_TYPES(Enum): class DISPLAY_TYPES(Enum):
NUMBER = 'number' NUMBER = 'number'
CIRCLE = 'circle'

View File

@@ -1 +1,2 @@
from .number import NumberView from .number import NumberView
from .circle import CircleView

View File

@@ -15,6 +15,8 @@ class View(Frame):
self.canvas = Canvas(self, width=144, height=168, background='white') self.canvas = Canvas(self, width=144, height=168, background='white')
self.canvas.pack() self.canvas.pack()
self.center = (144 // 2, 168 // 2)
self._init_canvas() self._init_canvas()
def _init_canvas(self): def _init_canvas(self):

45
frontend/views/circle.py Normal file
View File

@@ -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)