3. Grunder

Detta avsnitt kommer introducera några av de viktigaste aspekterna i GTK+.

3.1. Huvudslinga och signaler

Som de flesta verktygslådor för grafiska användargränssnitt använder GTK+ en händelsedriven programmeringsmodell. Då användaren gör något sitter GTK+ i huvudslingan och väntar på inmatning. Om användaren utför någon åtgärd - exempelvis ett musklick - så ”vaknar” huvudslingan och levererar en händelse till GTK+.

När komponenter tar emot en händelse så sänder de ofta ut en eller flera signaler. Signaler meddelar ditt program att ”något intressant inträffade” genom att anropa funktioner som du anslutit till signalen. Sådana funktioner kallas vanligen återanrop. Då dina återanrop anropas skulle du vanligen utföra någon åtgärd - då exempelvis en Öppna-knapp klickas på kanske du visar en filväljardialog. Efter att ett återanrop slutförs kommer GTK+ återgå till huvudslingan och vänta på mer användarinmatning.

Ett generiskt exempel är:

handler_id = widget.connect("event", callback, data)

Först så är widget en instans av en komponent vi skapade tidigare. Härnäst är händelsen ”event” som vi är intresserade av. Varje komponent har sina egna specifika händelser som kan inträffa. Om du exempelvis har en knapp så skulle du vanligen vilja ansluta den till händelsen ”clicked”. Det här betyder att när knappen klickas på så utfärdas signalen. Som trea kommer argumentet callback som är namnet på återanropsfunktionen. Den innehåller koden som körs när signaler av den angivna typen utfärdas. Slutligen inkluderar argumentet data de data som ska skickas när signalen utfärdas. Detta argument är dock fullständigt valfritt och kan utelämnas om det inte behövs.

Funktionen returnerar ett tal som identifierar detta specifika signal-återanropspar. Det krävs för att koppla bort från en signal så att återanropsfunktionen inte kommer anropas under framtida eller aktuellt pågående utsändningar av signalen den har anslutits till.

widget.disconnect(handler_id)

Om du förlorat ”handler_id” av någon anledning (till exempel för att hanterarna installerades med Gtk.Builder.connect_signals()), så kan du fortfarande koppla från ett specifikt återanrop med funktionen disconnect_by_func():

widget.disconnect_by_func(callback)

Program bör ansluta till toppnivåfönstrets ”destroy”-signal. Den sänds ut när ett objekt förstörs, så när en användare begär att ett toppnivåfönster stängs så förstör standardhanteraren för denna signal fönstret, men avslutar inte programmet. Att ansluta ”destroy”-signalen för toppnivåfönstret till funktionen Gtk.main_quit() kommer att resultera i det önskade beteendet.

window.connect("destroy", Gtk.main_quit)

Att anropa Gtk.main_quit() får huvudslingan i Gtk.main() att returnera.

3.2. Egenskaper

Egenskaper beskriver konfigurationen och tillståndet för komponenter. Som för signaler så har varje komponent sin specifika uppsättning egenskaper. Exempelvis har en knapp egenskapen ”label” som innehåller texten för label-komponenten i knappen. Du kan ange namnet och värdet på valfritt antal egenskaper som nyckelordsargument då du skapar en instans av en komponent. För att skapa en högerjusterad etikett med texten ”Hello World” och en vinkel på 25 grader, använd:

label = Gtk.Label(label="Hello World", angle=25, halign=Gtk.Align.END)

vilket är ekvivalent med

label = Gtk.Label()
label.set_label("Hello World")
label.set_angle(25)
label.set_halign(Gtk.Align.END)

Istället för att använda get- och set-metoder kan du också erhålla och ställa in gobjekt-egenskaperna genom egenskapen ”props” som widget.props.egenskapsnamn = värde. Detta är ekvivalent med det mer utförliga widget.get_property("egenskapsnamn") och widget.set_property("egenskapsnamn", värde).

För att se vilka egenskaper som är tillgängliga för en komponent i versionen som körs av GTK kan du köra ”dir” på egenskapen ”props”:

widget = Gtk.Box()
print(dir(widget.props))

Detta kommer i konsolen skriva listan av egenskaper som en Gtk.Box har.