ソースを参照

fix bug with delete_queue

Falko Schindler 1 年間 前
コミット
d1f1e0e1e7
2 ファイル変更8 行追加11 行削除
  1. 1 1
      nicegui/element.py
  2. 7 10
      nicegui/outbox.py

+ 1 - 1
nicegui/element.py

@@ -354,4 +354,4 @@ class Element(Visibility):
 
     def delete(self) -> None:
         """Perform cleanup when the element is deleted."""
-        outbox.enqueue_delete(self.id)
+        outbox.enqueue_delete(self)

+ 7 - 10
nicegui/outbox.py

@@ -13,7 +13,6 @@ MessageType = str
 Message = Tuple[ClientId, MessageType, Any]
 
 update_queue: DefaultDict[ClientId, Dict[ElementId, 'Element']] = defaultdict(dict)
-delete_queue: Deque[ElementId] = deque()
 message_queue: Deque[Message] = deque()
 
 
@@ -21,8 +20,8 @@ def enqueue_update(element: 'Element') -> None:
     update_queue[element.client.id][element.id] = element
 
 
-def enqueue_delete(element_id: ElementId) -> None:
-    delete_queue.append(element_id)
+def enqueue_delete(element: 'Element') -> None:
+    update_queue[element.client.id][element.id] = None
 
 
 def enqueue_message(message_type: MessageType, data: Any, target_id: ClientId) -> None:
@@ -37,22 +36,20 @@ async def _emit(message_type: MessageType, data: Any, target_id: ClientId) -> No
 
 async def loop() -> None:
     while True:
-        if not update_queue and not message_queue and not delete_queue:
+        if not update_queue and not message_queue:
             await asyncio.sleep(0.01)
             continue
 
         coros = []
         try:
             for client_id, elements in update_queue.items():
-                data = {element_id: element._to_dict() for element_id, element in elements.items()}
+                data = {
+                    element_id: element._to_dict() if element else None
+                    for element_id, element in elements.items()
+                }
                 coros.append(_emit('update', data, client_id))
             update_queue.clear()
 
-            if delete_queue:
-                data = {element_id: None for element_id in delete_queue}
-                coros.append(_emit('update', data, client_id))
-            delete_queue.clear()
-
             for target_id, message_type, data in message_queue:
                 coros.append(_emit(message_type, data, target_id))
             message_queue.clear()