Op 01/13/2018 om 05:19 PM schreef Hayden Lau:
> I understand this is a dev mailing list, but I’m not sure where to post this 
> question otherwise.

You can try the Gtk user mailinglist but I have not had much answers in
there regarding Gio's DBus classes.

> I’m attempting to write an application that interacts with UDisks2 over  DBus 
> with PyGObject. However, I’m finding that after instantiating the  proper 
> Gio.DBusObjectManagerClient, I seem to be unable to get updates  on the 
> ObjectManager’s state. Am I missing something? The only example  code that I 
> could find that had similar functionality was in udiskie 
> (https://github.com/coldfix/udiskie),  but that application uses 
> Gio.DBusProxy directly. Is that the  recommended approach? My (non-working) 
> proof of concept code pasted  below. It prints the initial set of objects 
> reported by the  ‘org.freedesktop.UDisks2’ object manager, but does not print 
> changes  (either via signal or polling) when disks are added or removed.

The object manager is there as the name suggest to manage dbus objects.
From it you can easily create proxies for all the objects it manages. If
you like some other examples of how to use Gio's dbus classes have a
look at
https://github.com/blueman-project/blueman/tree/master/blueman/bluez.

Now for the actual problem. Gio dbus implementation require a eventloop
to update. If you do not intend to use any Gtk widgets you can use
GLib.MainLoop if you do then call Gtk.main at the end of your module

> ========================
> from time import sleep
> import gi
> gi.require_version('Gio', '2.0')
> from gi.repository import Gio
from gi.repository import GLib
>
> udisks2 = Gio.DBusObjectManagerClient.new_for_bus_sync(
>     Gio.BusType.SYSTEM, 
>     Gio.DBusObjectManagerClientFlags.NONE,
>     'org.freedesktop.UDisks2',
>     '/org/freedesktop/UDisks2',
>     None,
>     None,
>     None
> )
>
> def new_obj_handler(obj):
>     print('New Object: ', obj)
>
> def new_iface_handler(obj):
>     print('New Interface: ', obj)
>
> def get_paths(objmgr):
>     return [obj.get_object_path() for obj in objmgr.get_objects()]
>
> udisks2.connect('interface-added', new_iface_handler)
> udisks2.connect('object-added', new_obj_handler)
loop = GLib.MainLoop()
loop.run()

> paths = []
> while(True):
>     if paths != get_paths(udisks2):
>         paths = get_paths(udisks2)
>         print(paths)
>     sleep(1)

Above is not going to work when you use an eventloop. You will need to
schedule a function to be run, for example with GLib.timeout_add_seconds
[1].

~infirit

[1]
https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-add-seconds

_______________________________________________
python-hackers-list mailing list
python-hackers-list@gnome.org
https://mail.gnome.org/mailman/listinfo/python-hackers-list

Reply via email to