import tkinter as tk from tkinter import ttk from PIL import Image, ImageDraw, ImageChops from .base import View class CircleView(View): @property def target(self): try: return float(self._target.get()) except ValueError: return 0.0 @target.setter def target(self, value): self._target.delete(0, tk.END) self._target.insert(0, str(value)) def __init__(self, parent, size, center, radius_offset=11, **kwargs): self.target_radius = min(center) - radius_offset super().__init__(parent, size, center, **kwargs) def init_ui(self, parent): self.ui = tk.Frame(parent) self.ui.pack() self._target_label = ttk.Label(self.ui, text="Target (g)") self._target_label.pack(side=tk.LEFT) self._target = ttk.Entry(self.ui) self._target.insert(0, "0.0") self._target.pack(side=tk.LEFT) def _init_im(self): im = Image.new('1', self.size, 'white') draw = ImageDraw.Draw(im) draw.circle(self.center, self.target_radius, outline="#000000") return im def update_weight(self, weight): weight_radius = 0.0 bkg_im = self.bkg_im.copy() try: target = float(self._target.get()) if target > 0: draw = ImageDraw.Draw(bkg_im) draw.text((60, 98), f"{target:.1f} g", fill='black', font_size=16) weight_radius = weight / target * self.target_radius else: return bkg_im im = Image.new('1', self.size, 'black') draw = ImageDraw.Draw(im) if weight_radius > 0.1: draw.circle(self.center, weight_radius, fill="#FFFFFF") return ImageChops.logical_xor(bkg_im, im) except Exception as e: print('Invalid target value:', e) pass return bkg_im