首页 > 解决方案 > 使用 OSC 更新 GANSpace 中的滑块

问题描述

我正在尝试使用来自python-osc 的消息更新来自GANSpace的 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()

我收到错误,我尝试在函数外运行“等待”,而我尝试的另一种方式似乎已经有一个主循环在运行,因此无法运行新的..

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

标签: pythonpython-asynciogenerative-adversarial-networkosc

解决方案


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

import asyncio
asyncio.run(init_main())

推荐阅读