Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 23 additions & 5 deletions leads_gui/photo.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,37 @@
from tkinter import Misc as _Misc, Event as _Event
from typing import Callable as _Callable, override as _override

from PIL.Image import Image as _Image
from PIL.ImageTk import PhotoImage as _PhotoImage
from customtkinter import StringVar as _StringVar
from customtkinter import Variable as _Variable, StringVar as _StringVar

from leads_gui.prototype import CanvasBased, VariableControlled
from leads_gui.types import Color as _Color
from leads_video import base64_decode_image as _base64_decode_image


class Base64Photo(CanvasBased, VariableControlled):
class ImageVariable(_Variable):
def __init__(self, master: _Misc, image: _Image, name: str | None = None) -> None:
super().__init__(master, False, name)
self._image: _Image = image

@_override
def set(self, value: _Image) -> None:
super().set(not super().get())
self._image = value

@_override
def get(self) -> _Image:
return self._image


class Photo(CanvasBased, VariableControlled):
def __init__(self,
master: _Misc,
theme_key: str = "CTkLabel",
width: float = 0,
height: float = 0,
variable: _StringVar | None = None,
variable: _StringVar | ImageVariable | None = None,
fg_color: _Color | None = None,
hover_color: _Color | None = None,
bg_color: _Color | None = None,
Expand All @@ -32,8 +48,10 @@ def __init__(self,
def dynamic_renderer(self, canvas: CanvasBased) -> None:
canvas.clear("d")
w, h, hc, vc, limit = canvas.meta()
if base64 := self._variable.get():
self._image = _PhotoImage(_base64_decode_image(base64).resize((w, h)))
if image := self._variable.get():
if isinstance(image, str):
image = _base64_decode_image(image)
self._image = _PhotoImage(image.resize((w, h)))
canvas.collect("d0", canvas.create_image(hc, vc, image=self._image))

@_override
Expand Down
4 changes: 2 additions & 2 deletions leads_vec/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from leads_audio import DIRECTION_INDICATOR_ON, DIRECTION_INDICATOR_OFF, WARNING, CONFIRM
from leads_gui import RuntimeData, Window, GForceVar, FrequencyGenerator, Left, Color, Right, ContextManager, \
Typography, Speedometer, ProxyCanvas, SpeedTrendMeter, GForceMeter, Stopwatch, Hazard, initialize, Battery, Brake, \
ESC, Satellite, Motor, Speed, Base64Photo, Light
ESC, Satellite, Motor, Speed, Photo, Light
from leads_vec.__version__ import __version__


Expand Down Expand Up @@ -88,7 +88,7 @@ def render(manager: ContextManager) -> None:
font=("Arial", cfg.font_size_small - 4))
)
if has_device(REAR_VIEW_CAMERA):
m1_widgets += (Base64Photo(root, theme_key="CTkButton", variable=var_rear_view_base64),)
m1_widgets += (Photo(root, theme_key="CTkButton", variable=var_rear_view_base64),)
manager["m1"] = ProxyCanvas(root, "CTkButton", *m1_widgets).lock_ratio(cfg.m_ratio)
manager["m2"] = Speedometer(root, variable=var_speed).lock_ratio(cfg.m_ratio)
manager["m3"] = ProxyCanvas(root, "CTkButton",
Expand Down