49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
import tkinter as tk
|
|
from tkinter import ttk
|
|
from PIL import Image, ImageDraw, ImageChops
|
|
|
|
from .base import View
|
|
|
|
class CircleView(View):
|
|
|
|
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, 100.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())
|
|
weight_radius = weight / target * self.target_radius
|
|
|
|
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
|
|
|