What it is
GTK (GIMP Toolkit) is a multi-platform toolkit for creating graphical user interfaces. In Python, GTK is accessible via the PyGObject library, allowing developers to build desktop applications with windows, dialogs, buttons, menus, and more.
GTK allows developers to build windows, buttons, labels, text entries, and complex layouts. It supports signals for event handling, CSS-like styling, and integration with OpenGL or Cairo for custom drawing.
Installation
pip install PyGObjectGetting started
The smallest useful thing you can do with it, and what each part means.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MyWindow(Gtk.Window):
def __init__(self):
super().__init__(title='Hello GTK')
self.set_default_size(300, 200)
button = Gtk.Button(label='Click Me')
button.connect('clicked', self.on_button_clicked)
self.add(button)
def on_button_clicked(self, widget):
print('Button clicked!')
win = MyWindow()
win.connect('destroy', Gtk.main_quit)
win.show_all()
Gtk.main()box = Gtk.Box(spacing=6)
win.add(box)
label = Gtk.Label(label='Hello')
entry = Gtk.Entry()
box.pack_start(label, True, True, 0)
box.pack_start(entry, True, True, 0)Advanced usage
Where the library earns its place over a simpler alternative.
store = Gtk.ListStore(str, int)
store.append(['Alice', 25])
store.append(['Bob', 30])
treeview = Gtk.TreeView(model=store)
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn('Name', renderer, text=0)
treeview.append_column(column)
column2 = Gtk.TreeViewColumn('Age', renderer, text=1)
treeview.append_column(column2)
win.add(treeview)dialog = Gtk.MessageDialog(parent=win, flags=0, message_type=Gtk.MessageType.INFO, buttons=Gtk.ButtonsType.OK, text='Hello Dialog')
dialog.run()
dialog.destroy()css_provider = Gtk.CssProvider()
css_provider.load_from_data(b'button { background-color: #3498db; color: white; }')
Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)button.connect('clicked', on_button_clicked)
window.connect('destroy', Gtk.main_quit)Errors and fixes
The failures you are most likely to hit, and what actually resolves them.
- Gtk.main_quit not called
- Ensure you connect the destroy signal to Gtk.main_quit to properly exit the application.
- Widget not showing
- Call `show()` or `show_all()` on the widget or parent container.
- TypeError: cannot register type
- Check PyGObject version compatibility with GTK version.
Best practices
- Use Gtk.Builder and .ui files for complex layouts to separate UI from code.
- Always call `show_all()` on windows to display all widgets.
- Connect signals carefully to avoid memory leaks.
- Use containers like Box, Grid, or Paned for flexible layouts.
- Follow GTK CSS conventions to style applications consistently.
Background
Why it exists, and what it was reacting to.
GTK was originally developed for the GIMP image editor and has evolved into a widely used toolkit for creating GUI applications on Linux, Windows, and macOS. PyGObject provides Python bindings for GTK 3 and GTK 4, enabling Python developers to create native-feeling desktop applications.
