1
0
Эх сурвалжийг харах

Merge branch 'main' into binding

Falko Schindler 4 жил өмнө
parent
commit
f629a2207a

+ 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.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)
                 ui.number(label='Number', on_change=lambda e: output.set_text(e.value), value=3.1415927, decimals=2)
             with ui.column():
             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():
         with ui.row():
             ui.label('Output:')
             ui.label('Output:')
             output = ui.label()
             output = ui.label()

+ 6 - 2
nicegui/elements/button.py

@@ -17,13 +17,17 @@ class Button(Element):
 
 
         view = jp.QButton(
         view = jp.QButton(
             label=text,
             label=text,
-            icon=icon,
-            icon_right=icon_right,
             color=color,
             color=color,
             text_color=text_color,
             text_color=text_color,
             **{key: True for key in design.split()},
             **{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:
         if on_click is not None:
             view.on('click', handle_exceptions(provide_arguments(on_click)))
             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):
 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)
         super().__init__(close)
 
 
@@ -11,6 +11,8 @@ class LinePlot(Plot):
         self.Y = [[] for _ in range(n)]
         self.Y = [[] for _ in range(n)]
         self.lines = [self.fig.gca().plot([], [])[0] 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.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):
     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]]):
     def push(self, x: List[float], Y: List[List[float]]):
 
 
+        self.push_counter += 1
+
         self.x = [*self.x, *x][self.slice]
         self.x = [*self.x, *x][self.slice]
         for i in range(len(self.lines)):
         for i in range(len(self.lines)):
             self.Y[i] = [*self.Y[i], *Y[i]][self.slice]
             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_xdata(self.x)
             self.lines[i].set_ydata(self.Y[i])
             self.lines[i].set_ydata(self.Y[i])
+
         flat_y = [y_i for y in self.Y for y_i in y]
         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)
         self.view.set_figure(self.fig)

+ 8 - 3
nicegui/elements/radio.py

@@ -1,13 +1,18 @@
 import justpy as jp
 import justpy as jp
-from typing import Callable, List
+from typing import Callable, List, Dict, Union
 from .element import Element
 from .element import Element
 from ..utils import handle_exceptions, provide_arguments
 from ..utils import handle_exceptions, provide_arguments
 
 
 class Radio(Element):
 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:
         if on_change is not None:
             view.on('input', handle_exceptions(provide_arguments(on_change, 'value')))
             view.on('input', handle_exceptions(provide_arguments(on_change, 'value')))

+ 10 - 3
nicegui/elements/select.py

@@ -1,13 +1,20 @@
 import justpy as jp
 import justpy as jp
-from typing import Callable, List
+from typing import Callable, List, Dict, Union
 from .element import Element
 from .element import Element
 from ..utils import handle_exceptions, provide_arguments
 from ..utils import handle_exceptions, provide_arguments
 
 
 class Select(Element):
 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:
         if on_change is not None:
             view.on('input', handle_exceptions(provide_arguments(on_change, 'value')))
             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.select import Select as select
     from .elements.slider import Slider as slider
     from .elements.slider import Slider as slider
     from .elements.switch import Switch as switch
     from .elements.switch import Switch as switch
+    from .elements.toggle import Toggle as toggle
 
 
     from .elements.plot import Plot as plot
     from .elements.plot import Plot as plot
     from .elements.line_plot import LinePlot as line_plot
     from .elements.line_plot import LinePlot as line_plot