浏览代码

Merge branch 'main' into binding

Falko Schindler 4 年之前
父节点
当前提交
f629a2207a
共有 7 个文件被更改,包括 72 次插入13 次删除
  1. 8 2
      main.py
  2. 6 2
      nicegui/elements/button.py
  3. 19 3
      nicegui/elements/line_plot.py
  4. 8 3
      nicegui/elements/radio.py
  5. 10 3
      nicegui/elements/select.py
  6. 20 0
      nicegui/elements/toggle.py
  7. 1 0
      nicegui/ui.py

+ 8 - 2
main.py

@@ -17,8 +17,14 @@ with ui.row():
                 ui.input(label='Text', on_change=lambda e: output.set_text(e.value))
                 ui.number(label='Number', on_change=lambda e: output.set_text(e.value), value=3.1415927, decimals=2)
             with ui.column():
-                ui.radio(['A', 'B', 'C'], on_change=lambda e: output.set_text(e.value))
-                ui.select(['1', '2', '3'], on_change=lambda e: output.set_text(e.value))
+                with ui.row():
+                    ui.radio(options=['A', 'B', 'C'], value='A', on_change=lambda e: output.set_text(e.value))
+                    ui.radio(options={1: 'A', 2: 'B', 3: 'C'}, value=1, on_change=lambda e: output.set_text(e.value))
+                with ui.row():
+                    ui.select(options=['a', 'b', 'c'], value='a', on_change=lambda e: output.set_text(e.value))
+                    ui.select(options={1: 'a', 2: 'b', 3: 'c'}, value=1, on_change=lambda e: output.set_text(e.value))
+                ui.toggle(['1', '2', '3'], value='1', on_change=lambda e: output.set_text(e.value))
+                ui.toggle({1: 'X', 2: 'Y', 3: 'Z'}, value=1, on_change=lambda e: output.set_text(e.value))
         with ui.row():
             ui.label('Output:')
             output = ui.label()

+ 6 - 2
nicegui/elements/button.py

@@ -17,13 +17,17 @@ class Button(Element):
 
         view = jp.QButton(
             label=text,
-            icon=icon,
-            icon_right=icon_right,
             color=color,
             text_color=text_color,
             **{key: True for key in design.split()},
         )
 
+        if icon is not None:
+            view.icon = icon
+
+        if icon_right is not None:
+            icon_right = icon_right
+
         if on_click is not None:
             view.on('click', handle_exceptions(provide_arguments(on_click)))
 

+ 19 - 3
nicegui/elements/line_plot.py

@@ -3,7 +3,7 @@ from .plot import Plot
 
 class LinePlot(Plot):
 
-    def __init__(self, n: int = 1, limit: int = 100, close: bool = True):
+    def __init__(self, n: int = 1, limit: int = 100, update_every=1, close: bool = True):
 
         super().__init__(close)
 
@@ -11,6 +11,8 @@ class LinePlot(Plot):
         self.Y = [[] for _ in range(n)]
         self.lines = [self.fig.gca().plot([], [])[0] for _ in range(n)]
         self.slice = slice(0 if limit is None else -limit, None)
+        self.update_every = update_every
+        self.push_counter = 0
 
     def with_legend(self, titles: List[str], **kwargs):
 
@@ -20,12 +22,26 @@ class LinePlot(Plot):
 
     def push(self, x: List[float], Y: List[List[float]]):
 
+        self.push_counter += 1
+
         self.x = [*self.x, *x][self.slice]
         for i in range(len(self.lines)):
             self.Y[i] = [*self.Y[i], *Y[i]][self.slice]
+
+        if self.push_counter % self.update_every != 0:
+            return
+
+        for i in range(len(self.lines)):
             self.lines[i].set_xdata(self.x)
             self.lines[i].set_ydata(self.Y[i])
+
         flat_y = [y_i for y in self.Y for y_i in y]
-        self.fig.gca().set_xlim(min(self.x), max(self.x))
-        self.fig.gca().set_ylim(min(flat_y), max(flat_y))
+        min_x = min(self.x)
+        max_x = max(self.x)
+        min_y = min(flat_y)
+        max_y = max(flat_y)
+        pad_x = 0.01 * (max_x - min_x)
+        pad_y = 0.01 * (max_y - min_y)
+        self.fig.gca().set_xlim(min_x - pad_x, max_x + pad_x)
+        self.fig.gca().set_ylim(min_y - pad_y, max_y + pad_y)
         self.view.set_figure(self.fig)

+ 8 - 3
nicegui/elements/radio.py

@@ -1,13 +1,18 @@
 import justpy as jp
-from typing import Callable, List
+from typing import Callable, List, Dict, Union
 from .element import Element
 from ..utils import handle_exceptions, provide_arguments
 
 class Radio(Element):
 
-    def __init__(self, options: List[str], value: str = None, on_change: Callable = None):
+    def __init__(self, options: Union[List, Dict], value: any = None, on_change: Callable = None):
 
-        view = jp.QOptionGroup(value=value, options=[{'label': o, 'value': o} for o in options])
+        if isinstance(options, list):
+            options_ = [{'label': option, 'value': option} for option in options]
+        else:
+            options_ = [{'label': value, 'value': key} for key, value in options.items()]
+
+        view = jp.QOptionGroup(value=value, options=options_)
 
         if on_change is not None:
             view.on('input', handle_exceptions(provide_arguments(on_change, 'value')))

+ 10 - 3
nicegui/elements/select.py

@@ -1,13 +1,20 @@
 import justpy as jp
-from typing import Callable, List
+from typing import Callable, List, Dict, Union
 from .element import Element
 from ..utils import handle_exceptions, provide_arguments
 
 class Select(Element):
 
-    def __init__(self, options: List[str], value: str = None, on_change: Callable = None):
+    def __init__(self, options: Union[List, Dict], value: any = None, on_change: Callable = None):
 
-        view = jp.QSelect(value=value, options=options)
+        if isinstance(options, list):
+            options_ = options
+            value_ = value
+        else:
+            options_ = [{'label': value, 'value': key} for key, value in options.items()]
+            value_ = options.get(value)
+
+        view = jp.QSelect(value=value_, options=options_)
 
         if on_change is not None:
             view.on('input', handle_exceptions(provide_arguments(on_change, 'value')))

+ 20 - 0
nicegui/elements/toggle.py

@@ -0,0 +1,20 @@
+import justpy as jp
+from typing import Callable, List, Dict, Union
+from .element import Element
+from ..utils import handle_exceptions, provide_arguments
+
+class Toggle(Element):
+
+    def __init__(self, options: Union[List, Dict], value: any = None, on_change: Callable = None):
+
+        if isinstance(options, list):
+            options_ = [{'label': option, 'value': option} for option in options]
+        else:
+            options_ = [{'label': value, 'value': key} for key, value in options.items()]
+
+        view = jp.QBtnToggle(value=value, options=options_)
+
+        if on_change is not None:
+            view.on('input', handle_exceptions(provide_arguments(on_change, 'value')))
+
+        super().__init__(view)

+ 1 - 0
nicegui/ui.py

@@ -11,6 +11,7 @@ class Ui:
     from .elements.select import Select as select
     from .elements.slider import Slider as slider
     from .elements.switch import Switch as switch
+    from .elements.toggle import Toggle as toggle
 
     from .elements.plot import Plot as plot
     from .elements.line_plot import LinePlot as line_plot