Estoy intentando actualizar los controles deslizantes en interactive.py desde GANSpace con mensajes de python-osc. Idealmente, la función on_draw debería ejecutarse después de recibir una serie de mensajes OSC. Pero tengo problemas para implementarlo, porque la función serve.forever () está bloqueando y no puedo averiguar cómo implementar la versión asíncrona.

Cuando me gusta esto:

def set_slider_osc(addr, args):
    print("[{0}] ~ {1}".format(args, addr))
    #print(re.split('/',addr)[2])
    if "/0" in addr:
        ui_state.sliders[0].set(args)
    if "/1" in addr:
        ui_state.sliders[1].set(args)

async def loop():
    while not pending_close:
        root.update()
        app.update()
        on_draw()
        reposition_toolbar()
        await asyncio.sleep(0)


async def init_main():
    setup_model()
    setup_ui()
    resample_latent()

    pending_close = False
    
    dispatcher = dispatcher.Dispatcher()
    dispatcher.map("/Chroma/*", set_slider_osc)
    
    server = AsyncIOOSCUDPServer(("127.0.0.1", 8000), dispatcher, asyncio.get_event_loop())
    transport, protocol = await server.create_serve_endpoint()  # Create datagram endpoint and start serving

    await loop()  # Enter main loop of program

    transport.close()  # Clean up serve endpoint
    root.destroy()

#
if __name__=='__main__':
    await init_main()

Recibo el error de que trato de ejecutar 'await' fuera de una función y de otra manera que lo intenté, parecía que ya se estaba ejecutando un bucle principal y, por lo tanto, no podía ejecutar uno nuevo.

Sé que es mucho pedirle a la gente que instale GANSpace, pero espero que alguien pueda arrojar algo de luz sobre cómo se puede hacer esto.

1
Simon Møller Hermansen 3 mar. 2021 a las 17:59

1 respuesta

La mejor respuesta

await no se puede usar fuera de una función definida con async def. Está intentando utilizarlo fuera de una función. La solución es ejecutar init_main en un bucle de eventos.

import asyncio
asyncio.run(init_main())
1
dirn 3 mar. 2021 a las 15:44