浏览代码

don't update views during async event handler

Falko Schindler 2 年之前
父节点
当前提交
58fe90ab1d

+ 1 - 1
nicegui/elements/button.py

@@ -25,7 +25,7 @@ class Button(Element):
 
         def process_event(view, event) -> Optional[bool]:
             socket = event.get('websocket')
-            return handle_event(on_click, ClickEventArguments(sender=self, socket=socket), update=self.parent_view)
+            return handle_event(on_click, ClickEventArguments(sender=self, socket=socket))
 
         view.on('click', process_event)
 

+ 1 - 1
nicegui/elements/color_picker.py

@@ -22,7 +22,7 @@ class ColorPicker(Element):
             ''')
 
         def handle_pick(sender, msg: Dict):
-            return handle_event(on_pick, ColorPickEventArguments(sender=self, color=msg.value), update=self.parent_view)
+            return handle_event(on_pick, ColorPickEventArguments(sender=self, color=msg.value))
         view.name_dict['color_input'].on('change', handle_pick)
         view.name_dict['color_input'].disable_input_event = True
         view.name_dict['popup'].value = value

+ 1 - 1
nicegui/elements/keyboard.py

@@ -62,6 +62,6 @@ class Keyboard(Element):
                 modifiers=modifiers,
                 key=key
             )
-            return handle_event(self.key_handler, arguments, update=self.parent_view)
+            return handle_event(self.key_handler, arguments)
         except Exception:
             traceback.print_exc()

+ 1 - 1
nicegui/elements/menu_item.py

@@ -22,7 +22,7 @@ class MenuItem(Element):
 
         def handle_click(view, event) -> Optional[bool]:
             socket = event.get('websocket')
-            result = handle_event(on_click, ClickEventArguments(sender=self, socket=socket), update=self.parent_view)
+            result = handle_event(on_click, ClickEventArguments(sender=self, socket=socket))
             if auto_close:
                 assert isinstance(self.parent_view, jp.QMenu)
                 self.parent_view.value = False

+ 1 - 1
nicegui/elements/scene.py

@@ -57,7 +57,7 @@ class SceneView(CustomView):
         try:
             for hit in msg.hits:
                 hit.object = self.objects.get(hit.object_id)
-            return handle_event(self.on_click, msg, update=self)
+            return handle_event(self.on_click, msg)
         except:
             traceback.print_exc()
 

+ 1 - 1
nicegui/elements/tree.py

@@ -27,7 +27,7 @@ class Tree(Element):
 
         def process_event(view, event) -> Optional[bool]:
             arguments = ValueChangeEventArguments(sender=self, socket=event.get('websocket'), value=event.get('value'))
-            return handle_event(on_select, arguments, update=self.parent_view)
+            return handle_event(on_select, arguments)
 
         view.on('update:selected', process_event)
         view.on('update:expanded', lambda *_: create_task(view.update()))

+ 1 - 1
nicegui/elements/upload.py

@@ -35,7 +35,7 @@ class Upload(Element):
                 if form_data.type == 'file':
                     files = [base64.b64decode(f.file_content) for f in form_data.files]
                     arguments = UploadEventArguments(sender=self, files=files)
-                    if handle_event(self.upload_handler, arguments, update=self.parent_view):
+                    if handle_event(self.upload_handler, arguments):
                         page_update = None
             return page_update
         except Exception:

+ 1 - 2
nicegui/elements/value_element.py

@@ -11,8 +11,7 @@ from .element import Element
 class ValueElement(Element):
     value = BindableProperty(
         on_change=lambda sender, value: handle_event(sender.change_handler,
-                                                     ValueChangeEventArguments(sender=sender, value=value),
-                                                     update=sender.parent_view))
+                                                     ValueChangeEventArguments(sender=sender, value=value)))
 
     def __init__(self, view: jp.HTMLBaseComponent, *, value: Any, on_change: Optional[Callable]):
         super().__init__(view)

+ 2 - 11
nicegui/events.py

@@ -2,7 +2,6 @@ import traceback
 from inspect import signature
 from typing import Any, Callable, List, Optional
 
-from justpy.htmlcomponents import HTMLBaseComponent
 from pydantic import BaseModel
 from starlette.websockets import WebSocket
 
@@ -219,22 +218,14 @@ class KeyEventArguments(EventArguments):
     modifiers: KeyboardModifiers
 
 
-def handle_event(handler: Optional[Callable], arguments: EventArguments, *,
-                 update: Optional[HTMLBaseComponent] = None) -> Optional[bool]:
+def handle_event(handler: Optional[Callable], arguments: EventArguments) -> Optional[bool]:
     try:
         if handler is None:
             return False
         no_arguments = not signature(handler).parameters
         result = handler() if no_arguments else handler(arguments)
         if is_coroutine(handler):
-            async def async_handler():
-                try:
-                    await result
-                    if update is not None:
-                        await update.update()
-                except Exception:
-                    traceback.print_exc()
-            create_task(async_handler(), name=str(handler))
+            create_task(result, name=str(handler))
         return False
     except Exception:
         traceback.print_exc()