This repository has been archived on 2024-07-28. You can view files and clone it, but cannot push or open issues or pull requests.
Files
trio-gtk/README.md
2020-10-11 13:14:47 +02:00

62 lines
2.2 KiB
Markdown

# trio-gtk
[![Build Status](https://drone.autonomic.zone/api/badges/decentral1se/trio-gtk/status.svg?ref=refs/heads/master)](https://drone.autonomic.zone/decentral1se/trio-gtk)
## Trio guest mode wrapper for PyGTK
Using the [Trio guest mode](https://trio.readthedocs.io/en/latest/reference-lowlevel.html#using-guest-mode-to-run-trio-on-top-of-other-event-loops) feature, we can run both the Trio and PyGTK event loops alongside each other in a single program. This allows us to make use of the Trio library and the usual `async`/`await` syntax and not have to directly manage thread pools. This library provides a thin wrapper for initialising the guest mode and exposes a single public API function, `trio_gtk.run` into which you can pass your Trio main function.
## Install
```sh
$ pip install trio-gtk
```
Please note, `trio-gtk` does install [pygobject](https://gitlab.gnome.org/GNOME/pygobject) directly as a Python package. We use relaxed bounds to ensure that the hard dependency on system packages (see [cairo integration documentation](https://pygobject.readthedocs.io/en/latest/guide/cairo_integration.html)) will not stop you having a successful installation. This may not always work out. If you see a build error during your Pip installation, please raise a ticket and we will see what we can do.
## Example
```python
import gi
import trio
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk as gtk
import trio_gtk
class Example(gtk.Window):
def __init__(self, nursery):
gtk.Window.__init__(self, title="Example")
self.button = gtk.Button(label="Create a task")
self.button.connect("clicked", self.on_click)
self.add(self.button)
self.counter = 0
self.nursery = nursery
self.connect("destroy", gtk.main_quit)
self.show_all()
def on_click(self, widget):
self.counter += 1
self.nursery.start_soon(self.say_hi, self.counter)
async def say_hi(self, count):
while True:
await trio.sleep(1)
print(f"hi from task {count}")
async def main():
async with trio.open_nursery() as nursery:
Example(nursery)
await trio.sleep_forever()
trio_gtk.run(main)
```