使用 OSC 更新 GANSpace 中的滑块

Using OSC to update sliders in GANSpace

我正在尝试从 GANSpace with messages from python-osc 更新 interactive.py 中的滑块。 理想情况下,on_draw 函数在收到一系列 OSC 消息后应该 运行。 但是我在实现它时遇到了麻烦,因为 serve.forever() 函数正在阻塞,我不知道如何实现异步版本。

当我这样做时:

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()

我得到一个错误,我尝试 运行 'await' 在一个函数之外,而我尝试的另一种方式似乎已经有一个主循环 运行ning,因此不能' t 运行 一个新的..

我知道要求人们安装 GANSpace,但希望有人能阐明如何做到这一点。

await 不能在用 async def 定义的函数之外使用。您正试图在函数之外使用它。解决方法是在事件循环中 运行 init_main

import asyncio
asyncio.run(init_main())