瀏覽代碼

update plots; introduce "once" argument for timer

Falko Schindler 4 年之前
父節點
當前提交
fe2171a8f1
共有 2 個文件被更改,包括 31 次插入7 次删除
  1. 7 1
      main.py
  2. 24 6
      nice_gui.py

+ 7 - 1
main.py

@@ -21,8 +21,14 @@ with ui.row():
     time = ui.label()
     ui.timer(0.1, lambda: time.set_text(datetime.now().strftime("%X")))
 
-with ui.plot():
+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()

+ 24 - 6
nice_gui.py

@@ -6,6 +6,7 @@ import inspect
 import time
 import asyncio
 from contextlib import contextmanager
+from matplotlib import pyplot as plt
 from utils import handle_exceptions, provide_arguments
 
 wp = jp.WebPage(delete_flag=False, title='Nice GUI', favicon='favicon.png')
@@ -40,6 +41,14 @@ class Element:
 
         view_stack.pop()
 
+class Plot(Element):
+
+    def update(self, close=True):
+
+        self.view.set_figure(plt.gcf())
+        if close:
+            plt.close()
+
 class Ui(Starlette):
 
     def label(self, text=''):
@@ -55,10 +64,13 @@ class Ui(Starlette):
         return Element(view)
 
     @contextmanager
-    def plot(self):
+    def plot(self, close=True):
 
-        yield
-        jp.Matplotlib(a=view_stack[-1])
+        view = jp.Matplotlib()
+        yield Plot(view)
+        view.set_figure(plt.gcf())
+        if close:
+            plt.close()
 
     def row(self):
 
@@ -75,7 +87,13 @@ class Ui(Starlette):
         view = jp.Div(classes='flex flex-col gap-4 items-start p-4 rounded shadow-lg')
         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())
 
         async def loop():
 
@@ -84,9 +102,9 @@ class Ui(Starlette):
                 handle_exceptions(callback)()
                 jp.run_task(wp.update())
                 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):