output_ctl.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from .input_ctrl import send_msg, single_input, input_control, next_event, run_async
  2. import asyncio
  3. import inspect
  4. from .framework import Global, Task
  5. def register_callback(callback, save, mutex_mode):
  6. """
  7. 为输出区显示的控件注册回调函数
  8. 原理:
  9. 向框架注册一个新协程,在协程内对回调函数进行调用 callback(widget_data, save)
  10. 协程会在用户与控件交互时触发
  11. :return: 协程id
  12. """
  13. async def callback_coro():
  14. while True:
  15. event = await next_event()
  16. assert event['event'] == 'callback'
  17. coro = None
  18. if asyncio.iscoroutinefunction(callback):
  19. coro = callback(event['data'], save)
  20. elif inspect.isgeneratorfunction(callback):
  21. coro = asyncio.coroutine(callback)(save, event['data'])
  22. else:
  23. callback(event['data'], save)
  24. if coro is not None:
  25. if mutex_mode:
  26. await coro
  27. else:
  28. run_async(coro)
  29. callback_task = Task(callback_coro(), Global.active_ws)
  30. callback_task.coro.send(None) # 激活,Non't callback.step() ,导致嵌套调用step todo 与inactive_coro_instances整合
  31. Global.active_ws.coros[callback_task.coro_id] = callback_task
  32. return callback_task.coro_id