Yesterday, I succeeded in moving a GTK2 project* with a custom Cairo widget to GTK3. It's about 750 lines of Python and took ~5 hours to migrate, mainly because my method was about googling and solving all Exceptions one by one. That's not very advisable.
You can read a more thorough introduction to GTK3 and Python here -> python-gtk-3-tutorial.rtfd.org
The first thing, you need to know, is that the Python GTK3 bindings are
GTK3/Glib uses different libraries from GTK2, and those libraries conflict with the old ones. So the first part of a migration is to replace ALL occurrences of those imports in your whole project.
Examples of old stuff:
import gtk import gobject import gtk.gdk import cairo import pangocairo # Since GTK 3.6, this is deprecated as it's a no-op. (https://developer.gnome.org/gdk3/stable/gdk3-Threads.html#gdk-threads-init) # Thanks @Mathieu Dupuy gtk.gdk.threads_init() # The below was used on systems with both GTK-1 and GTK-2 and is obsolete. # pygtk uses static gobject inheritance different from GTK3. # Short version: In GTK3, don't do this! import pygtk pygtk.require("2.0")
The example above is now:
from gi.repository import Gtk from gi.repository import GObject from gi.repository Gdk from gi.repository import cairo from gi.repository import PangoCairo Gdk.threads_init()
There are a bunch of changes in the structure of the library. Most constants like
gtk.CONSTANT_NAME have changed to something like
Gtk.SubLibrary.NAME. For instance,
gtk.gdk.LEAVE_NOTIFY_MASK is now
So basically, have a look at everything that's capilized. The following script can help you:
But last thing is that the library has a bunch of changes in the API. Classes, methods, properties, arguments and return values have all changed. So expect the unexpected!
In this regard, you might also find that your project is too complicated for 100% manual conversion. In that case, have a look at:
The following examples are available as of now: