GEPS 029: GTK3-GObject introspection Conversion
Gramps was written with GTK 2 toolkit. This has been replaced upstream with GTK 3, so Gramps should convert to GTK 3.
We try to convert 1 to 1. If there are problems due to deprecated features, or otherwise, add in the code:
# TODO GTK3: write what problem is due to gtk 3 conversion
Before release, all TODO GTK3 in the code must be cleaned up
Python GTK3 docs: 
Alternative is to look at the base C documentation, and understand from experience how the introspection works. Gnome docs: .
As python works with classes, it looks somewhat like the C++ interface: . To investigate the specific override (how to init Gtk classes):
- python overrides: 
Furthermore, for the other gi libs:
For people on Ubuntu 12.04, you need:
1. add the gnome_shell repo to have the latest version of glib and friends, see how to add the ppa on: gnome_shell pppa Then upgrade your system via the system manager.
Note 1 : If you use Gnome3, also add the gnome3 ppa!
Note 2: this can make gnome shell unstable if the ppa is too bleeding edge!!
2. install version 3.3.2 of pygobject. No ppa for this, I use the git repo on gnome.org, so my git config:
[remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = http://git.gnome.org/browse/pygobject
So to install it to folder pygobject, do
git clone git://git.gnome.org/pygobject pygobject
Then checkout tag 3.3.2, so
cd pygobject git checkout 3.3.2
Make sure you have the dependencies installed, you will need:
- libglib2.0-dev package (otherwise you will obtain an error like undefined mqcro: AM_PATH_GLIB_2_0.
- autoconf, automake, libtool, intltool package
- python-dev package
- libcairo2-dev, python-cairo-dev
So, use the line:
sudo apt-get install autoconf automake libtool python-dev libglib2.0-dev libcairo2-dev python-cairo-dev python-gobject-dev libgirepository1.0-dev
Then compile pygobject:
./autogen.sh make sudo make install
Now this installs to /usr/local, so to run the test with that, on ubuntu in your terminal:
PYTHONPATH=/usr/local/lib/python2.7/site-packages/ python gramps.py
If you then get:
$ PYTHONPATH=/usr/local/lib/python2.7/site-packages/ python src/gramps.py Gtk typelib not installed. Install Gnome Introspection, and pygobject version 3.3.2 or later. Gramps will terminate now.
You may need to:
Also, I had to get rid of the older gobject:
sudo rm -rf /usr/lib/python2.7/dist-packages/gobject
- we cannot set strings in struct, see GTK bug 
- error in list_families on textview in styledtexteditor: 
- str and unicode no longer seem to work, the encoding must be passed too; Future: deprecate unicode() in the code, as we want to support python 3
- there is no longer automatic conversion to str utf-8 when using GTK functions, we must convert before passing to GTK.
- glade can no longer work with our catalog. We need to upgrade comboboxentry to combobox with has_entry manually, and hope editors keep working... - SOLVED: converted editevent.glade, all works
- expose is no longer present on gtk.widget. Draw must be used. Unclear how, .
- Gtk.Clipboard seems to work differently
- Pedigreeview is broken and must be converted to new drawing primitives. Same probably for fanchart.
- osmgpsmap is GTK2. There is a GTK3 branch in git, we should try it, and contribute to the conversion.
- menu.popup does not seem to work in some instances. Passing position function seems to be the workaround, see grampsbar.py for example
Related Gramps Bugs
- #5009: Use gobject introspection for GTK 3 dependency
How to investigate a hard crash?
With GTK 3, hard crashes are a lot more likely than before. Very troubling for a python developer, as you do not know where the crash happens. So, to investigate these, do the following:
$ > gdb python (gdb) set env GRAMPSHOME /path/to/gramps/src (gdb) set env PYTHONPATH $PYTHONPATH:$GRAMPSHOME (gdb) r $GRAMPSHOME/gramps.py ...after the crash... (gdb) bt
This works best if you have the debug symbols installed for everything relevant, or are running from a self-built tree.