Continuing with the development of Satyr, which
doesn't have any GUI. I thought it would be faster to make a
DBus interface that a good GUI, not to mention more
interesting.
The code snippet of today is this:
class DBusServer (dbus.service.Object):
def __init__ (self):
bus= dbus.SessionBus ()
bus_name= dbus.service.BusName ('org.kde.satyr.dbus.test', bus=bus)
dbus.service.Object.__init__ (self, bus_name, "/server")
@dbus.service.method('org.kde.satyr.dbus.test', in_signature='', out_signature='')
def bing (self):
print "bing!"
@dbus.service.method('org.kde.satyr.dbus.test', in_signature='', out_signature='')
def quit (self):
app.quit ()
dbus.mainloop.qt.DBusQtMainLoop (set_as_default=True)
dbs= DBusServer ()
sys.exit (app.exec_ ())
This simply defines a class which registers itself with the
session bus under the name org.kde.satyr.dbus.test,
exporting itself under the path /server and then
defining a method that goes bing! :) and another
one that quits the app. Note the decorator for the methods.
You might notice the dbus.mainloop.qt.DBusQtMainLoop
(set_as_default=True) call. This is needed because both Qt
and DBus in asyncronous mode (which is the one we're using and the
only one that works under Qt or Gtk, AFAIK) both have their own
event loops, and that makes some kind of magic that let both loops
coexist without blocking the other. This must be called before
connecting to the bus; otherwise, you get this error:
RuntimeError: To make asynchronous calls, receive signals or export objects,
D-Bus connections must be attached to a main loop by passing mainloop=...
to the constructor or calling dbus.set_default_main_loop(...)
So, let's test the beast. We run the script in one terminal and in the other:
mdione@mustang:~/src/projects/satyr/live$ qdbus | grep satyr
org.kde.satyr.py-10154
org.kde.satyr.dbus.test
mdione@mustang:~/src/projects/satyr/live$ qdbus org.kde.satyr.dbus.test
/
/server
mdione@mustang:~/src/projects/satyr/live$ qdbus org.kde.satyr.dbus.test /server
method void org.kde.satyr.dbus.test.bing()
method QString org.freedesktop.DBus.Introspectable.Introspect()
mdione@mustang:~/src/projects/satyr/live$ qdbus org.kde.satyr.dbus.test /server org.kde.satyr.dbus.test.bing
mdione@mustang:~/src/projects/satyr/live$ qdbus org.kde.satyr.dbus.test /server org.kde.satyr.dbus.test.quit
And in the other console:
mdione@mustang:~/src/projects/satyr/live$ python dbus_test.py
bing!
It goes bing!... and then finishes. The next step is to make my
Player class to export its methods via
DBus and that's it!. More info in the Python
DBus tutorial.