Przeglądaj źródła

allow binding source with local file paths

Rodja Trappe 1 rok temu
rodzic
commit
bf64e25ab5
2 zmienionych plików z 52 dodań i 3 usunięć
  1. 3 3
      nicegui/elements/mixins/source_element.py
  2. 49 0
      tests/test_image.py

+ 3 - 3
nicegui/elements/mixins/source_element.py

@@ -14,10 +14,8 @@ class SourceElement(Element):
 
 
     def __init__(self, *, source: Union[str, Path], **kwargs: Any) -> None:
     def __init__(self, *, source: Union[str, Path], **kwargs: Any) -> None:
         super().__init__(**kwargs)
         super().__init__(**kwargs)
-        if is_file(source):
-            source = globals.app.add_static_file(local_file=source)
         self.source = source
         self.source = source
-        self._props['src'] = source
+        self.on_source_change(source)
 
 
     def bind_source_to(self,
     def bind_source_to(self,
                        target_object: Any,
                        target_object: Any,
@@ -81,5 +79,7 @@ class SourceElement(Element):
 
 
         :param source: The new source.
         :param source: The new source.
         """
         """
+        if is_file(source):
+            source = globals.app.add_static_file(local_file=source)
         self._props['src'] = source
         self._props['src'] = source
         self.update()
         self.update()

+ 49 - 0
tests/test_image.py

@@ -1,7 +1,12 @@
+import time
+from pathlib import Path
+
 from nicegui import ui
 from nicegui import ui
 
 
 from .screen import Screen
 from .screen import Screen
 
 
+example_file = str(Path(__file__).resolve().parent / '../examples/slideshow/slides/slide1.jpg')
+
 
 
 def test_base64_image(screen: Screen):
 def test_base64_image(screen: Screen):
     data = ('data:image/png;base64,'
     data = ('data:image/png;base64,'
@@ -30,3 +35,47 @@ def test_base64_image(screen: Screen):
     screen.wait(0.2)
     screen.wait(0.2)
     image = screen.find_by_class('q-img__image')
     image = screen.find_by_class('q-img__image')
     assert 'data:image/png;base64,iVB' in image.get_attribute('src')
     assert 'data:image/png;base64,iVB' in image.get_attribute('src')
+
+
+def test_setting_local_file(screen: Screen):
+    ui.image(example_file)
+
+    screen.open('/')
+    image = screen.find_by_class('q-img__image')
+    deadline = time.time() + 2
+    while time.time() < deadline:
+        js = 'return arguments[0].naturalWidth > 0 && arguments[0].naturalHeight > 0'
+        if screen.selenium.execute_script(js, image):
+            break
+    else:
+        assert False, 'image not loaded'
+
+
+def test_binding_local_file(screen: Screen):
+    images = {'one': example_file}
+    ui.image().bind_source_from(images, 'one')
+
+    screen.open('/')
+    image = screen.find_by_class('q-img__image')
+    deadline = time.time() + 2
+    while time.time() < deadline:
+        js = 'return arguments[0].naturalWidth > 0 && arguments[0].naturalHeight > 0'
+        if screen.selenium.execute_script(js, image):
+            break
+    else:
+        assert False, 'image not loaded'
+
+
+def test_set_source_with_local_file(screen: Screen):
+    ui.image().set_source(example_file)
+
+    screen.open('/')
+    image = screen.find_by_class('q-img__image')
+    deadline = time.time() + 2
+    while time.time() < deadline:
+        js = 'return arguments[0].naturalWidth > 0 && arguments[0].naturalHeight > 0'
+        if screen.selenium.execute_script(js, image):
+            break
+    else:
+        assert False, 'image not loaded'
+    screen.wait(0.2)