Concurrency in UI Toolkits
guigarage.com
guigarage.com
It's not immediately obvious how to "yield from start_button()", but the solution is to have a FIFO command queue like in this article. The UI thread pushes commands to this queue and then the coroutine can act on the command.
This also simplifies changing the exact meaning of buttons/keys like "back" depending on the context, and handling multi-step network tasks, like using external APIs, ssh commands to a server, file downloads and the like. Using a command queue in Asyncio makes UI actions and IO events interchangeable.
This highlights why the idea of running a UI in the browser is actually seriously broken.
If you ever want to do non-UI work, you should use Web Workers, which were invented specifically because doing non-UI complex tasks in the UI thread got really common when HTML unexpectedly became an application platform.