Christoph Trappe před 3 roky
rodič
revize
86d72aeb5b

+ 1 - 1
nicegui/elements/button.py

@@ -25,7 +25,7 @@ class Button(Element):
         self.text = text
         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):
         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
 from inspect import signature
-from justpy.htmlcomponents import HTMLBaseComponent
 from pydantic import BaseModel
 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
 
@@ -11,6 +10,7 @@ class EventArguments(BaseModel):
     class Config:
         arbitrary_types_allowed = True
     sender: Element
+    event: Dict
 
 class ClickEventArguments(EventArguments):
     pass
@@ -197,10 +197,7 @@ class KeyEventArguments(EventArguments):
     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:
         if handler is None:
             return
@@ -210,8 +207,6 @@ def handle_event(handler: Optional[Union[Callable, Awaitable]],
             async def async_handler():
                 try:
                     await result
-                    if update is not None:
-                        await update.update()
                 except Exception:
                     traceback.print_exc()
             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.notify import Notify as notify
     from .elements.number import Number as number
+    from .elements.open import Open as open
     from .elements.page import Page as page
     from .elements.radio import Radio as radio
     from .elements.scene import Scene as scene