RkBlog

Hardware, programming and astronomy tutorials and reviews.

Wprowadzenie do PyGTK

Opis biblioteki PyGTK udostępniającej API biblioteki GTK+ do tworzenia graficznych interfejsów aplikacji desktopowych. Artykuł opisuje instalację i wykorzystanie biblioteki oraz podstawowe narzedzia

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

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