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

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

Rodja Trappe 4 жил өмнө
parent
commit
67ddcfbfd7
2 өөрчлөгдсөн 40 нэмэгдсэн , 5 устгасан
  1. 11 1
      main.py
  2. 29 4
      nice_gui.py

+ 11 - 1
main.py

@@ -1,6 +1,7 @@
 #!/usr/bin/env python3
 #!/usr/bin/env python3
 from nice_gui import ui
 from nice_gui import ui
 from datetime import datetime
 from datetime import datetime
+from matplotlib import pyplot as plt
 
 
 ui.label('Hello world!')
 ui.label('Hello world!')
 
 
@@ -15,10 +16,19 @@ with ui.card():
             ui.label('C2')
             ui.label('C2')
             ui.label('C3')
             ui.label('C3')
 
 
-
 with ui.row():
 with ui.row():
     ui.label('Time:')
     ui.label('Time:')
     time = ui.label()
     time = ui.label()
     ui.timer(0.1, lambda: time.set_text(datetime.now().strftime("%X")))
     ui.timer(0.1, lambda: time.set_text(datetime.now().strftime("%X")))
 
 
+with ui.plot(close=False) as plot:
+    plt.title('Some plot')
+    plt.plot(range(10), [x**2 for x in range(10)])
+
+def update_plot():
+    plt.title('Some plot with a second curve')
+    plt.plot(range(10), [100 - x**2 for x in range(10)])
+    plot.update()
+ui.timer(3.0, update_plot, once=True)
+
 ui.run()
 ui.run()

+ 29 - 4
nice_gui.py

@@ -5,6 +5,8 @@ import uvicorn
 import inspect
 import inspect
 import time
 import time
 import asyncio
 import asyncio
+from contextlib import contextmanager
+from matplotlib import pyplot as plt
 from utils import handle_exceptions, provide_arguments
 from utils import handle_exceptions, provide_arguments
 import icecream
 import icecream
 
 
@@ -42,6 +44,14 @@ class Element:
 
 
         view_stack.pop()
         view_stack.pop()
 
 
+class Plot(Element):
+
+    def update(self, close=True):
+
+        self.view.set_figure(plt.gcf())
+        if close:
+            plt.close()
+
 class Ui(Starlette):
 class Ui(Starlette):
 
 
     def label(self, text=''):
     def label(self, text=''):
@@ -56,6 +66,15 @@ class Ui(Starlette):
             view.on('click', handle_exceptions(provide_arguments(on_click)))
             view.on('click', handle_exceptions(provide_arguments(on_click)))
         return Element(view)
         return Element(view)
 
 
+    @contextmanager
+    def plot(self, close=True):
+
+        view = jp.Matplotlib()
+        yield Plot(view)
+        view.set_figure(plt.gcf())
+        if close:
+            plt.close()
+
     def row(self):
     def row(self):
 
 
         view = jp.Div(classes='flex flex-row gap-4 items-start')
         view = jp.Div(classes='flex flex-row gap-4 items-start')
@@ -71,7 +90,13 @@ class Ui(Starlette):
         view = jp.Div(classes='flex flex-col gap-4 items-start p-4 rounded shadow-lg')
         view = jp.Div(classes='flex flex-col gap-4 items-start p-4 rounded shadow-lg')
         return Element(view)
         return Element(view)
 
 
-    def timer(self, inverval, callback):
+    def timer(self, interval, callback, *, once=False):
+
+        async def timeout():
+
+            await asyncio.sleep(interval)
+            handle_exceptions(callback)()
+            jp.run_task(wp.update())
 
 
         def update(view):
         def update(view):
             if view.components:
             if view.components:
@@ -87,13 +112,13 @@ class Ui(Starlette):
                 handle_exceptions(callback)()
                 handle_exceptions(callback)()
                 update(view_stack[-1])
                 update(view_stack[-1])
                 dt = time.time() - start
                 dt = time.time() - start
-                await asyncio.sleep(inverval - dt)
+                await asyncio.sleep(interval - dt)
 
 
-        jp.run_task(loop())
+        jp.run_task(timeout() if once else loop())
 
 
     def run(self):
     def run(self):
 
 
-        # NOTE: prevent reloader to restart uvicorn
+        # NOTE: prevent reloader from restarting uvicorn
         if inspect.stack()[-2].filename.endswith('spawn.py'):
         if inspect.stack()[-2].filename.endswith('spawn.py'):
             return
             return