浏览代码

Adds ui.open()

Christoph Trappe 3 年之前
父节点
当前提交
86d72aeb5b
共有 5 个文件被更改,包括 44 次插入9 次删除
  1. 1 1
      nicegui/elements/button.py
  2. 15 0
      nicegui/elements/open.js
  3. 24 0
      nicegui/elements/open.py
  4. 3 8
      nicegui/events.py
  5. 1 0
      nicegui/ui.py

+ 1 - 1
nicegui/elements/button.py

@@ -25,7 +25,7 @@ class Button(Element):
         self.text = text
         self.text = text
         self.bind_text_to(self.view, 'label')
         self.bind_text_to(self.view, 'label')
 
 
-        view.on('click', lambda *_: handle_event(on_click, ClickEventArguments(sender=self), update=self.parent_view))
+        view.on('click', lambda view, event: handle_event(on_click, ClickEventArguments(sender=self, event=event)))
 
 
     def set_text(self, text: str):
     def set_text(self, text: str):
         self.text = text
         self.text = text

+ 15 - 0
nicegui/elements/open.js

@@ -0,0 +1,15 @@
+Vue.component("open", {
+  template: `<span v-bind:id="jp_props.id" :class="jp_props.classes" :style="jp_props.style"></span>`,
+  mounted() {
+    comp_dict[this.$props.jp_props.id] = this;
+    console.log("Mounted!");
+  },
+  methods: {
+    redirect(line) {
+      window.location.href = line;
+    },
+  },
+  props: {
+    jp_props: Object,
+  },
+});

+ 24 - 0
nicegui/elements/open.py

@@ -0,0 +1,24 @@
+import asyncio
+from .element import Element
+from .custom_view import CustomView
+
+class OpenView(CustomView):
+
+    def __init__(self):
+        super().__init__('open', __file__)
+        self.initialize()
+
+class Open(Element):
+
+    def __init__(self, path: str, event_arguments=None):
+        super().__init__(OpenView())
+        if event_arguments:
+            self.push(path, event_arguments)
+
+    async def push_async(self, line: str, event_arguments):
+        websocket = event_arguments.event.get('websocket')
+        await self.view.run_method(f'redirect("{line}")', websocket)
+        print('button was pressed. origin ' + str(websocket), flush=True)
+
+    def push(self, line: str, e):
+        asyncio.get_event_loop().create_task(self.push_async(line, e))

+ 3 - 8
nicegui/events.py

@@ -1,9 +1,8 @@
 import asyncio
 import asyncio
 from inspect import signature
 from inspect import signature
-from justpy.htmlcomponents import HTMLBaseComponent
 from pydantic import BaseModel
 from pydantic import BaseModel
 import traceback
 import traceback
-from typing import Any, Awaitable, Callable, List, Optional, Union
+from typing import Any, Awaitable, Callable, Dict, List, Optional, Union
 
 
 from .elements.element import Element
 from .elements.element import Element
 
 
@@ -11,6 +10,7 @@ class EventArguments(BaseModel):
     class Config:
     class Config:
         arbitrary_types_allowed = True
         arbitrary_types_allowed = True
     sender: Element
     sender: Element
+    event: Dict
 
 
 class ClickEventArguments(EventArguments):
 class ClickEventArguments(EventArguments):
     pass
     pass
@@ -197,10 +197,7 @@ class KeyEventArguments(EventArguments):
     modifiers: KeyboardModifiers
     modifiers: KeyboardModifiers
 
 
 
 
-def handle_event(handler: Optional[Union[Callable, Awaitable]],
-                 arguments: EventArguments,
-                 *,
-                 update: Optional[HTMLBaseComponent] = None):
+def handle_event(handler: Optional[Union[Callable, Awaitable]], arguments: EventArguments):
     try:
     try:
         if handler is None:
         if handler is None:
             return
             return
@@ -210,8 +207,6 @@ def handle_event(handler: Optional[Union[Callable, Awaitable]],
             async def async_handler():
             async def async_handler():
                 try:
                 try:
                     await result
                     await result
-                    if update is not None:
-                        await update.update()
                 except Exception:
                 except Exception:
                     traceback.print_exc()
                     traceback.print_exc()
             asyncio.get_event_loop().create_task(async_handler())
             asyncio.get_event_loop().create_task(async_handler())

+ 1 - 0
nicegui/ui.py

@@ -20,6 +20,7 @@ class Ui:
     from .elements.menu_separator import MenuSeparator as menu_separator
     from .elements.menu_separator import MenuSeparator as menu_separator
     from .elements.notify import Notify as notify
     from .elements.notify import Notify as notify
     from .elements.number import Number as number
     from .elements.number import Number as number
+    from .elements.open import Open as open
     from .elements.page import Page as page
     from .elements.page import Page as page
     from .elements.radio import Radio as radio
     from .elements.radio import Radio as radio
     from .elements.scene import Scene as scene
     from .elements.scene import Scene as scene