|
@@ -1,16 +1,20 @@
|
|
from __future__ import annotations
|
|
from __future__ import annotations
|
|
-import time
|
|
|
|
|
|
|
|
|
|
+import time
|
|
from pathlib import Path
|
|
from pathlib import Path
|
|
from typing import Any, Callable, List, Optional, Union, cast
|
|
from typing import Any, Callable, List, Optional, Union, cast
|
|
|
|
|
|
|
|
+from PIL.Image import Image as PIL_Image
|
|
|
|
+
|
|
from ..events import GenericEventArguments, MouseEventArguments, handle_event
|
|
from ..events import GenericEventArguments, MouseEventArguments, handle_event
|
|
|
|
+from .image import pil_to_base64
|
|
from .mixins.content_element import ContentElement
|
|
from .mixins.content_element import ContentElement
|
|
from .mixins.source_element import SourceElement
|
|
from .mixins.source_element import SourceElement
|
|
|
|
|
|
|
|
|
|
class InteractiveImage(SourceElement, ContentElement, component='interactive_image.js'):
|
|
class InteractiveImage(SourceElement, ContentElement, component='interactive_image.js'):
|
|
CONTENT_PROP = 'content'
|
|
CONTENT_PROP = 'content'
|
|
|
|
+ PIL_CONVERT_FORMAT = 'PNG'
|
|
|
|
|
|
def __init__(self,
|
|
def __init__(self,
|
|
source: Union[str, Path] = '', *,
|
|
source: Union[str, Path] = '', *,
|
|
@@ -57,6 +61,11 @@ class InteractiveImage(SourceElement, ContentElement, component='interactive_ima
|
|
handle_event(on_mouse, arguments)
|
|
handle_event(on_mouse, arguments)
|
|
self.on('mouse', handle_mouse)
|
|
self.on('mouse', handle_mouse)
|
|
|
|
|
|
|
|
+ def _set_props(self, source: Union[str, Path]) -> None:
|
|
|
|
+ if isinstance(source, PIL_Image):
|
|
|
|
+ source = pil_to_base64(source, self.PIL_CONVERT_FORMAT)
|
|
|
|
+ super()._set_props(source)
|
|
|
|
+
|
|
def force_reload(self) -> None:
|
|
def force_reload(self) -> None:
|
|
"""Force the image to reload from the source."""
|
|
"""Force the image to reload from the source."""
|
|
self._props['t'] = time.time()
|
|
self._props['t'] = time.time()
|