Skip to content

Instantly share code, notes, and snippets.

@nosklo
Last active July 22, 2020 22:49
Show Gist options
  • Save nosklo/af157fd26c3f927d4c173b8ed0c04dff to your computer and use it in GitHub Desktop.
Save nosklo/af157fd26c3f927d4c173b8ed0c04dff to your computer and use it in GitHub Desktop.
pygobject-gtk3-trio-guest-mode
import trio
import gi
def gtk_main_trio_run(main_window, trio_func):
from gi.repository import GLib, Gtk
_outcome = None
window_close_scope = None
async def trio_context():
nonlocal window_close_scope
with trio.CancelScope() as window_close_scope:
return await trio_func()
raise RuntimeError('Window was closed')
def done_callback(_out):
nonlocal _outcome
_outcome = _out
Gtk.main_quit()
main_window.connect("destroy", lambda *args: window_close_scope.cancel())
trio.lowlevel.start_guest_run(
trio_context,
run_sync_soon_threadsafe=GLib.idle_add,
done_callback=done_callback,
host_uses_signal_set_wakeup_fd=True,
)
Gtk.main()
return _outcome.unwrap()
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
import trio
import gtriok
win = Gtk.Window()
pb = Gtk.ProgressBar()
win.add(pb)
win.show_all()
async def job():
for n in range(1, 1001):
await trio.sleep(0.02)
pb.set_fraction(n/1000)
await trio.sleep(0.1)
return "OK!"
result = gtriok.gtk_main_trio_run(win, job) # Gtk.main()
print(result)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment