12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- from .input_ctrl import send_msg, single_input, input_control, next_event, run_async
- import asyncio
- import inspect
- from .framework import Global, Task
- def register_callback(callback, save, mutex_mode):
- """
- 为输出区显示的控件注册回调函数
- 原理:
- 向框架注册一个新协程,在协程内对回调函数进行调用 callback(widget_data, save)
- 协程会在用户与控件交互时触发
- :return: 协程id
- """
- async def callback_coro():
- while True:
- event = await next_event()
- assert event['event'] == 'callback'
- coro = None
- if asyncio.iscoroutinefunction(callback):
- coro = callback(event['data'], save)
- elif inspect.isgeneratorfunction(callback):
- coro = asyncio.coroutine(callback)(save, event['data'])
- else:
- try:
- callback(event['data'], save)
- except:
- Global.active_ws.on_coro_error()
- if coro is not None:
- if mutex_mode:
- await coro
- else:
- run_async(coro)
- callback_task = Task(callback_coro(), Global.active_ws)
- callback_task.coro.send(None) # 激活,Non't callback.step() ,导致嵌套调用step todo 与inactive_coro_instances整合
- Global.active_ws.coros[callback_task.coro_id] = callback_task
- return callback_task.coro_id
|