瀏覽代碼

more general event arguments

Falko Schindler 4 年之前
父節點
當前提交
eea88cf2a3
共有 3 個文件被更改,包括 17 次插入9 次删除
  1. 3 3
      elements.py
  2. 2 2
      main.py
  3. 12 4
      utils.py

+ 3 - 3
elements.py

@@ -2,7 +2,7 @@ import justpy as jp
 from contextlib import contextmanager
 import asyncio
 import time
-from utils import handle_exceptions, provide_sender
+from utils import handle_exceptions, provide_arguments
 
 class Group:
 
@@ -14,7 +14,7 @@ class Group:
 
         b = jp.Button(text=text, a=self.view, classes='p-2 w-48 bg-blue-700 text-white text-center')
         if on_click is not None:
-            b.on('click', handle_exceptions(provide_sender(on_click, b)))
+            b.on('click', handle_exceptions(provide_arguments(on_click)))
         return b
 
     def checkbox(self, text=None, on_change=None) -> jp.Input:
@@ -24,7 +24,7 @@ class Group:
         if text is not None:
             jp.Div(text=text, a=d)
         if on_change is not None:
-            c.on('change', handle_exceptions(provide_sender(on_change, c)))
+            c.on('change', handle_exceptions(provide_arguments(on_change, 'checked')))
         return c
 
     @contextmanager

+ 2 - 2
main.py

@@ -10,10 +10,10 @@ with ui.row() as row:
         left.button('Button 1', on_click=lambda: left.label('Nice!'))
     with row.column() as right:
         right.label("Update itself:")
-        right.button('Button 2', on_click=lambda b: setattr(b, 'text', b.text + ' :)'))
+        right.button('Button 2', on_click=lambda e: setattr(e.sender, 'text', e.sender.text + ' :)'))
 
 with ui.row() as row:
-    row.checkbox('Let''s check...', on_change=lambda: row.label('Check!'))
+    row.checkbox('Let''s check...', on_change=lambda e: row.label('Check!' if e.checked else 'Uncheck.'))
 
 with ui.plot():
     plt.title('Some plot')

+ 12 - 4
utils.py

@@ -1,18 +1,26 @@
 import traceback
 
-def provide_sender(func, sender):
-    def inner_function(*args, **kwargs):
+class EventArguments:
+
+    def __init__(self, sender, **kwargs):
+
+        self.sender = sender
+        for key, value in kwargs.items():
+            setattr(self, key, value)
+
+def provide_arguments(func, *keys):
+    def inner_function(sender, event):
         try:
             func()
         except TypeError:
-            func(sender)
+            func(EventArguments(sender, **{key: event[key] for key in keys}))
     return inner_function
 
 def handle_exceptions(func):
     def inner_function(*args, **kwargs):
         try:
             func(*args, **kwargs)
-        except Exception as e:
+        except Exception:
             traceback.print_exc()
     return inner_function