Wprowadzenie do PyGTK

PyGTK to Pythonowe API dla biblioteki GTK+ służącej do tworzenia interfejsów graficznych. GTK+ wykorzystywana jest m.in. przez środowiska graficzne Gnome i XFCE. Samo PyGTK wymaga praktycznie tylko GTK+ (bez zależności związanymi z Gnome czy XFCE). Tak jak w przypadku PyQT interfejsy można określać bezpośrednio w kodzie aplikacji, lub też zastosować aplikację do "rysowania" interfejsów - Glade.

Zalety i Wady

  • Jest to biblioteka przenośna, choć nie działa to perfekcyjnie
  • Po PyQT najbardziej rozbudowana, dobrze wygląda pod Linuksem/Unixami (w odróżnieniu do tk_inter i częściowo wxPython)
  • Wiele artykułów w sieci, lecz starsze opisują przestarzałe wersje PyGTK

Instalacja

PyGTK jak i Glade znajduje się w repozytorium praktycznie każdej dystrybucji (chyba że bardzo nie lubi ona GTK+) i instalacja nie powinna stwarzać problemów. Na stronie GTK+ można pobrać pakiet dla MS Windows zawierający również Glade. Podobnie na stronie PyGTK dostępna jest też wersja dla MS Windows.

Prosta aplikacja PyGTK + Glade

Uruchom Glade (nazwa "glade-3" lub starsze "glade-2"). Pojawi się aplikacja z kilkoma blokami pełniącymi różne funkcje:
pygtk1
Po lewej znajduje się lista widżetów jakie możemy stosować do tworzenia interfejsów. Tworzenie zaczynamy od wybrania jakiegoś "okna" z pierwszej grupy "Toplevels". By móc umieścić w oknie więcej niż jeden widżet stosuje się kontenery ("Containers") dzielące okna na kilka części - a w każdej części można umieścić jeden widżet. Po prawej mamy kilka zakładek umożliwiających konfiguracje widżetów oraz aktywację sygnałów.
Klinkij na ikonę standardowego okna - pojawi się ono pośrodku aplikacji. Następnie zaznacz w menu po lewej "Etykietę" i kliknij na środek okna naszej aplikacji. Otrzymamy coś takiego:
pygtk2
Jak widać po prawej stronie w menu możemy podać tekst jaki ma być wyświetlany. "Nazwa" jest o tyle ważna iż określa nazwę widżetu od strony kodu. By nasza aplikacja PyGTK działała musimy jeszcze edytować właściwość "Widoczność" dla głównego okna i ustawić ją na "Tak":
pygtk3
Zapisujemy interfejs jako "kliknij.glade". W tym samym katalogu tworzymy plik "start.py" o kodzie:
# -*- coding: utf-8 -*-
import sys
# import PyGTK
import pygtk
pygtk.require("2.0")
import gtk
import gtk.glade


# bazowa klasa
class HellowWorldGTK:
	def __init__(self):
		# wybieramy plik *glade
		self.gladefile = "kliknij.glade"
		self.wTree = gtk.glade.XML(self.gladefile) 
		# pobieramy główne okno
		self.window = self.wTree.get_widget("MainWindow")
		if (self.window):
			self.window.connect("destroy", gtk.main_quit)

# wywołanie aplikacji
if __name__ == "__main__":
	hwg = HellowWorldGTK()
	gtk.main()
Jest to wyjściowy kod dla każdej aplikacji PyGTK wykorzystującej interfejs utworzony za pomocą Glade. W kodzie pojawia się self.wTree.get_widget("MainWindow"). "MainWindow" to nazwa głównego okna, którą oczywiście możemy zmienić w Glade. Wykonanie pliku "start.py" uruchomi aplikację (zamknięcie CTRL+C):
pygtk4

Sygnały i Sloty

Jak w PyQT mamy tutaj system sygnałów i slotów, który jednak funkcjonuje nieco inaczej. W Glade możemy włączyć dany sygnał dla danego widżeta, a w kodzie umieszczonym w "start.py" musimy połączyć ten sygnał z naszym slotem (lub slotem predefiniowanym z PyGTK) Otwórz stworzony przed chwilą interfejs w Glade, usuń etykietę (zaznacz widżet i wciśnij "Del") a następnie wybierz "przycisk" i umieść go w oknie:
pygtk5
Jak widać standardowa nazwa dla przycisku to "button1". Przejdź teraz do zakładki "Signals" i dla "clicked" kliknij w pole obok w kolumnie "Funkcja" i wybierz "on_button1_clicked". Zapisz interfejs.
pygtk6
Oto jak wygląda zmodyfikowany kod start.py:
# -*- coding: utf-8 -*-
import sys

import pygtk
pygtk.require("2.0")
import gtk
import gtk.glade



class HellowWorldGTK:
	def __init__(self):
		# wybieramy plik *glade
		self.gladefile = "kliknij.glade"
		self.wTree = gtk.glade.XML(self.gladefile) 
		# pobieramy główne okno
		self.window = self.wTree.get_widget("MainWindow")
		if (self.window):
			self.window.connect("destroy", gtk.main_quit)
		# tworzymy słownik i łączymy sygnał ze slotem
		dic = { "on_button1_clicked" : self.button_clicked }
		self.wTree.signal_autoconnect(dic)
	def button_clicked(self, widget):
		print "To działa!"

if __name__ == "__main__":
	hwg = HellowWorldGTK()
	gtk.main()
Pojawiło się:
dic = { "on_button1_clicked" : self.button_clicked }
self.wTree.signal_autoconnect(dic)
Gdzie on_button1_clicked to nazwa sygnału a self.button_clicked to nazwa metody naszej klasy (slot), która ma być wywołana po wyemitowaniu sygnału. Gdy teraz wykonamy "start.py" pojawi się okno z przyciskiem, a jego kliknięcie wyświetli tekst "To działa!" w konsoli.

Dodatki do PyGTK

pygtkglext to API OpenGL dla PyGTK, rtgraph udostępnia kilka widżetów do tworzenia wykresów w czasie rzeczywistym. gazpacho to aplikacja PyGTK podobna do Glade służąca do tworzenia interfejsów. Najwięcej dodatków oferuje jednak GNOME w pakietach gnome-python i gnome-python-extras, które wymagają wielu pakietów wspomnianego środowiska. Jednym z ciekawszych widżetów zawartych w tych dwóch pakietach jest pygtkmozembed czyli widżet Mozilli umożliwiający tworzenie przeglądarki www na bazie silnika Gecko. Znajduje się on w gnome-python-extras lecz nie wymaga Gnome (jedynie PyGTK i Firefoxa lub SeaMokey). Jeżeli nie chcesz instalować połowy Gnome wymuś pominięcie zależności w swoim menedżerze pakietów, lub pobierz kod źródłowy, rozpakuj i skompiluj. ./configure sprawdzi co może zostać zbudowane, a co nie:
The following modules will be built:

egg.trayicon
gtkmozembed (linking to firefox)

The following modules will NOT be built:

gtkhtml2
egg.recent
gtkspell
gdl
gda
gksu
gksu.ui
W dostępnych kodach źródłowych zamieściłem prostą przeglądarkę www wykorzystującą ten moduł ("gtk3"). Notka: obecnie żeby móc używać tego widgetu należy przed uruchomieniem ustawić zmienną systemową wskazującą lokację biblioteki, względem której python-gtkmozembed został skompilowany (xulrunner lub firefox). Przykład:
export MOZILLA_FIVE_HOME="/usr/lib/xulrunner-1.9/"
pygtk7
pygtk8

Pobierz źródła

Pobierz źródła
"gtk1" i "gtk2" to odpowiednio przykłady z etykietą i przyciskiem z tego artykułu. "gtk3" zawiera prostą przeglądarkę www bazującą na pygtkmozembed (podłączony jest jedynie pasek adresu strony)
RkBlog

PyGTK, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact