✈ Prague, ♥ Python

I've spend last week in Prague attending the Python Hackfest as you might have heard by others.

My goal was to get GNOME DVB Daemon's GUI ported to PyGI and GTK+3. I'm glad to say that I could reach that goal, getting closer to GNOME 3 readiness. Porting wasn't easy, because it basically requires to do two ports at once, to PyGI and to GTK+3. The good news is that during this process pygi-convert.sh got better, which should make other people's lives a little bit easier. Needless to say, a lot of bugs got fixed as well.

Here are some tips for those who want to port their applications:

  • Use JHBuild to setup an environment with GTK+3 and pygobject.
  • Run pygi-convert.sh.
  • Read the GTK+ 2.x to GTK+ 3 migration guide.
  • Most callbacks now require an additional parameter for user_data
  • Unfortunately pygi-convert.sh does just simple replacements and doesn't know anything about types. This especially becomes a problem for Gtk.Box.pack_start and Gtk.CellLayout.pack_start, where the former takes 4 arguments and the latter 2 arguments. The script assumes pack_start belongs to Gtk.Box, therefore you have to remove the last two arguments for Gtk.CellLayout's pack_start manually.
  • Column types of Gtk.ListStore and Gtk.TreeStore are now stricter, e.g. you can't add a long such as dbus.UInt32 to a column of type int. In addition, if you previously had a column of type gobject.TYPE_PYOBJECT but your object is a sub-class of gobject.GObject you have to change the column type to gobject.GObject. What makes it difficult is that you won't get an exception if the type is wrong, just a critical warning. Try commenting lines out to find the source of an error.
  • If you use Gtk.ComboBox with your own model, make sure that you call set_entry_text_column.
  • pygi-convert.sh adds a call to gobject.GObject.__init__ in every constructor of a GTK widget sub-class. But in the case of Gtk.Dialog you most likely want to call Gtk.Dialog.__init__, because it accepts keyword arguments as in PyGTK. This might apply to other widgets, where the default constructor has been overridden, too.
  • Get rid of Gtk.Alignment and use "halign", "valign" and "margin" properties on the child widget instead.
  • Porting an application takes a lot of trial and error, especially for ListStore and TreeStore. Start by commenting out non-essential parts to avoid getting overwhelmed by errors.

If you are interested in the ported code of GNOME DVB Daemon, it currently lives in a separate branch.

In summary, the hackfest was a great opportunity to port a mid-sized application in a rather short period of time and not forgetting meating my fellow hackers in person and enjoying the Czech cuisine. Which brings me to my next point: I want to thank J5 and Tomeu for organizing the hackfest, the GNOME Foundation for sponsoring my stay in Prague and last but not least Collabora for keeping us hydrated and a tremendously delicious duck.