浏览代码

Merge branch 'main' of github.com:zauberzeug/nicegui into main

Rodja Trappe 4 年之前
父节点
当前提交
c8652128a3

+ 4 - 3
examples.py

@@ -35,7 +35,8 @@ with ui.row():
             with ui.row():
                 ui.icon('far fa-clock')
                 clock = ui.label()
-                ui.timer(0.1, lambda: clock.set_text(datetime.now().strftime("%X")))
+                t = ui.timer(0.1, lambda: clock.set_text(datetime.now().strftime("%X")))
+            ui.checkbox('active').bind_value(t.active)
 
         with ui.card().add_classes('items-center'):
             ui.label('Style', 'h5')
@@ -61,8 +62,8 @@ with ui.row():
                 ui.slider(min=1, max=3).bind_value(model.value)
                 ui.label().bind_text(model.value)
         with ui.row().add_classes('items-center'):
-            on = ui.icon('visibility')
-            ui.checkbox('visible', value=True).bind_value_to(on.visible)
+            v = ui.checkbox('visible', value=True)
+            ui.icon('visibility').bind_visibility_from(v.value)
 
     with ui.card():
         ui.label('Matplotlib', 'h5')

+ 0 - 4
nicegui/elements/bool_element.py

@@ -11,7 +11,3 @@ class BoolElement(ValueElement):
                  on_change: Callable):
 
         super().__init__(view, design, value, on_change)
-
-    def set_view_value(self, value: bool):
-
-        self.view.value = value

+ 0 - 7
nicegui/elements/choice_element.py

@@ -17,10 +17,3 @@ class ChoiceElement(ValueElement):
             view.options = [{'label': value, 'value': key} for key, value in options.items()]
 
         super().__init__(view, design, value, on_change)
-
-    def set_view_value(self, value: any):
-
-        try:
-            self.view.value = value['value']
-        except TypeError:
-            self.view.value = value

+ 16 - 1
nicegui/elements/element.py

@@ -33,7 +33,22 @@ class Element:
     def visible(self, visible: bool):
 
         self.visible_ = visible
-        self.view.set_class('visible' if visible else 'invisible')
+        (self.view.remove_class if self.visible_ else self.view.set_class)('hidden')
+
+    def bind_visibility_to(self, target, forward=lambda x: x):
+
+        self.visible.bind_to(target, forward=forward, nesting=1)
+        return self
+
+    def bind_visibility_from(self, target, backward=lambda x: x):
+
+        self.visible.bind_from(target, backward=backward, nesting=1)
+        return self
+
+    def bind_visibility(self, target, forward=lambda x: x, backward=lambda x: x):
+
+        self.visible.bind(target, forward=forward, backward=backward, nesting=1)
+        return self
 
     def set_classes(self, classes: str):
 

+ 4 - 4
nicegui/elements/float_element.py

@@ -15,11 +15,11 @@ class FloatElement(ValueElement):
 
         super().__init__(view, design, value, on_change)
 
-    def set_view_value(self, value: float):
+    def value_to_view(self, value: float):
 
         if value is None:
-            self.view.value = None
+            return None
         elif self.format is None:
-            self.view.value = str(value)
+            return str(value)
         else:
-            self.view.value = self.format % float(value)
+            return self.format % float(value)

+ 8 - 0
nicegui/elements/select.py

@@ -13,3 +13,11 @@ class Select(ChoiceElement):
         view = jp.QSelect(options=options, input=self.handle_change)
 
         super().__init__(view, design, value, options, on_change)
+
+    def value_to_view(self, value: any):
+
+        matches = [o for o in self.view.options if o['value'] == value]
+        if any(matches):
+            return matches[0]['label']
+        else:
+            return value

+ 0 - 4
nicegui/elements/string_element.py

@@ -11,7 +11,3 @@ class StringElement(ValueElement):
                  on_change: Callable):
 
         super().__init__(view, design, value, on_change)
-
-    def set_view_value(self, value: str):
-
-        self.view.value = value

+ 5 - 1
nicegui/elements/value_element.py

@@ -19,7 +19,11 @@ class ValueElement(Element):
 
         self.on_change = on_change
         self.value = value
-        self.value.bind_to(self.view.value)
+        self.value.bind_to(self.view.value, forward=self.value_to_view)
+
+    def value_to_view(self, value):
+
+        return value
 
     def handle_change(self, msg):
 

+ 7 - 2
nicegui/timer.py

@@ -1,6 +1,7 @@
 import asyncio
 import time
 import traceback
+from binding import BindableProperty
 from .elements.element import Element
 from .utils import handle_exceptions
 
@@ -8,6 +9,8 @@ class Timer:
 
     tasks = []
 
+    active = BindableProperty
+
     def __init__(self, interval, callback, *, once=False):
         """Timer
 
@@ -19,6 +22,7 @@ class Timer:
         """
 
         parent = Element.view_stack[-1]
+        self.active = True
 
         async def timeout():
 
@@ -31,8 +35,9 @@ class Timer:
             while True:
                 try:
                     start = time.time()
-                    handle_exceptions(callback)()
-                    await parent.update()
+                    if self.active:
+                        handle_exceptions(callback)()
+                        await parent.update()
                     dt = time.time() - start
                     await asyncio.sleep(interval - dt)
                 except: