GTK+ 3: Interaktions-Widgets
Gtk.Toolbar
► GTK+ 3 Dokumentation: Gtk.Toolbar Gtk.ToolButton Gtk.SeparatorToolItem
Das Widget Gtk.Toolbar erzeugt eine Werkzeugleiste, die anklickbare Icons in Form des Widgets Gtk.ToolButton enthalten kann. Systemeigene Icons können über die Eigenschaft icon_name ausgewählt werden; der Name des Icons entspricht dabei der Vorgabe aus der Freedesktop.org Icon Naming Specification. Gruppen von Icons können mit dem Widget Gtk.SeparatorToolItem getrennt werden. Ein Icon wird mit insert() der Werkzeugleiste hinzugefügt.
Wird ein Icon angeklickt, so löst diese Aktion das Signal clicked aus, das mit einer entsprechenden Funktion verknüpft werden kann.
self.toolbar01 = Gtk.Toolbar()
self.box01.pack_start(self.toolbar01, False, False, 0)
self.toolbutton01 = Gtk.ToolButton(icon_name="document-open")
self.toolbutton01.connect('clicked', self.on_toolbutton01_clicked)
self.toolbar01.insert(self.toolbutton01, 0)
self.toolbutton02 = Gtk.ToolButton(icon_name="document-new")
self.toolbar01.insert(self.toolbutton02, 1)
self.separatortoolitem01 = Gtk.SeparatorToolItem()
self.toolbar01.insert(self.separatortoolitem01, 2)
self.toolbutton03 = Gtk.ToolButton(icon_name="help-about")
self.toolbar01.insert(self.toolbutton03, 3)
Das folgende Python-Skript erzeugt eine Liste aller verfügbaren Icons:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# dependencies: python3-gi
"""
This program displays a list of all desktop icons along with their names listed on https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html .
Coded by Holger Löwenherz, decocode.de, May 2021
"""
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Desktop Icons")
self.set_icon_from_file("/usr/share/pixmaps/python3.xpm")
self.set_position(Gtk.WindowPosition.CENTER)
self.set_default_size(300, 400)
self.set_border_width(6)
names = ["address-book-new", "application-exit", "appointment-new", "call-start", "call-stop", "contact-new", "document-new", "document-open", "document-open-recent", "document-page-setup", "document-print", "document-print-preview", "document-properties", "document-revert", "document-save", "document-save-as", "document-send", "edit-clear", "edit-copy", "edit-cut", "edit-delete", "edit-find", "edit-find-replace", "edit-paste", "edit-redo", "edit-select-all", "edit-undo", "folder-new", "format-indent-less", "format-indent-more", "format-justify-center", "format-justify-fill", "format-justify-left", "format-justify-right", "format-text-direction-ltr", "format-text-direction-rtl", "format-text-bold", "format-text-italic", "format-text-underline", "format-text-strikethrough", "go-bottom", "go-down", "go-first", "go-home", "go-jump", "go-last", "go-next", "go-previous", "go-top", "go-up", "help-about", "help-contents", "help-faq", "insert-image", "insert-link", "insert-object", "insert-text", "list-add", "list-remove", "mail-forward", "mail-mark-important", "mail-mark-junk", "mail-mark-notjunk", "mail-mark-read", "mail-mark-unread", "mail-message-new", "mail-reply-all", "mail-reply-sender", "mail-send", "mail-send-receive", "media-eject", "media-playback-pause", "media-playback-start", "media-playback-stop", "media-record", "media-seek-backward", "media-seek-forward", "media-skip-backward", "media-skip-forward", "object-flip-horizontal", "object-flip-vertical", "object-rotate-left", "object-rotate-right", "process-stop", "system-lock-screen", "system-log-out", "system-run", "system-search", "system-reboot", "system-shutdown", "tools-check-spelling", "view-fullscreen", "view-refresh", "view-restore", "view-sort-ascending", "view-sort-descending", "window-close", "window-new", "zoom-fit-best", "zoom-in", "zoom-original", "zoom-out", "process-working", "accessories-calculator", "accessories-character-map", "accessories-dictionary", "accessories-text-editor", "help-browser", "multimedia-volume-control", "preferences-desktop-accessibility", "preferences-desktop-font", "preferences-desktop-keyboard", "preferences-desktop-locale", "preferences-desktop-multimedia", "preferences-desktop-screensaver", "preferences-desktop-theme", "preferences-desktop-wallpaper", "system-file-manager", "system-software-install", "system-software-update", "utilities-system-monitor", "utilities-terminal", "applications-accessories", "applications-development", "applications-engineering", "applications-games", "applications-graphics", "applications-internet", "applications-multimedia", "applications-office", "applications-other", "applications-science", "applications-system", "applications-utilities", "preferences-desktop", "preferences-desktop-peripherals", "preferences-desktop-personal", "preferences-other", "preferences-system", "preferences-system-network", "system-help", "audio-card", "audio-input-microphone", "battery", "camera-photo", "camera-video", "camera-web", "computer", "drive-harddisk", "drive-optical", "drive-removable-media", "input-gaming", "input-keyboard", "input-mouse", "input-tablet", "media-flash", "media-floppy", "media-optical", "media-tape", "modem", "multimedia-player", "network-wired", "network-wireless", "pda", "phone", "printer", "scanner", "video-display", "emblem-default", "emblem-documents", "emblem-downloads", "emblem-favorite", "emblem-important", "emblem-mail", "emblem-photos", "emblem-readonly", "emblem-shared", "emblem-symbolic-link", "emblem-synchronized", "emblem-system", "emblem-unreadable", "face-angel", "face-angry", "face-cool", "face-crying", "face-devilish", "face-embarrassed", "face-kiss", "face-laugh", "face-monkey", "face-plain", "face-raspberry", "face-sad", "face-sick", "face-smile", "face-smile-big", "face-smirk", "face-surprise", "face-tired", "face-uncertain", "face-wink", "face-worried", "flag-aa", "application-x-executable", "audio-x-generic", "font-x-generic", "image-x-generic", "package-x-generic", "text-html", "text-x-generic", "text-x-generic-template", "text-x-script", "video-x-generic", "x-office-address-book", "x-office-calendar", "x-office-document", "x-office-presentation", "x-office-spreadsheet", "folder", "folder-remote", "network-server", "network-workgroup", "start-here", "user-bookmarks", "user-desktop", "user-home", "user-trash", "appointment-missed", "appointment-soon", "audio-volume-high", "audio-volume-low", "audio-volume-medium", "audio-volume-muted", "battery-caution", "battery-low", "dialog-error", "dialog-information", "dialog-password", "dialog-question", "dialog-warning", "folder-drag-accept", "folder-open", "folder-visiting", "image-loading", "image-missing", "mail-attachment", "mail-unread", "mail-read", "mail-replied", "mail-signed", "mail-signed-verified", "media-playlist-repeat", "media-playlist-shuffle", "network-error", "network-idle", "network-offline", "network-receive", "network-transmit", "network-transmit-receive", "printer-error", "printer-printing", "security-high", "security-medium", "security-low", "software-update-available", "software-update-urgent", "sync-error", "sync-synchronizing", "task-due", "task-past-due", "user-available", "user-away", "user-idle", "user-offline", "user-trash-full", "weather-clear", "weather-clear-night", "weather-few-clouds", "weather-few-clouds-night", "weather-fog", "weather-overcast", "weather-severe-alert", "weather-showers", "weather-showers-scattered", "weather-snow", "weather-storm"]
self.scrolledwindow = Gtk.ScrolledWindow()
self.scrolledwindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
self.add(self.scrolledwindow)
self.grid = Gtk.Grid()
self.grid.set_column_spacing(5)
self.grid.set_row_spacing(5)
self.scrolledwindow.add(self.grid)
self.icon = []
self.label = []
for i in range(0, len(names)):
self.icon.append(Gtk.Image.new_from_icon_name(names[i], Gtk.IconSize.DIALOG))
self.grid.attach(self.icon[i], 0, i, 1, 1)
self.label.append(Gtk.Label())
self.label[i].set_text(names[i])
self.label[i].set_selectable(True)
self.label[i].set_xalign(0)
self.grid.attach(self.label[i], 1, i, 1, 1)
def quit_window(self, widget):
Gtk.main_quit()
win = MyWindow()
win.connect("delete-event", quit_window)
win.show_all()
Gtk.main()
Gtk.Entry
► GTK+ 3 Dokumentation: Gtk.Entry
Das Widget Gtk.Entry erzeugt ein Texteingabefeld. Mit set_text() kann ein Text vorgegeben werden. Mit get_text() kann ein eingegebener Text ausgelesen werden.
Wird der Text des Eingabefeldes geändert, so löst diese Aktion das Signal changed aus, das mit einer entsprechenden Funktion verknüpft werden kann.
Das Betätigen der Eingabe-Taste löst das Signal activate aus.
self.entry01 = Gtk.Entry()
self.entry01.set_text("Hallo Welt!")
self.entry01.connect('changed', self.on_entry01_changed)
self.entry01.connect('activate', self.on_entry01_activate)
self.box02.pack_start(self.entry01, True, True, 6)
print(self.entry01.get_text())
Gtk.Button
► GTK+ 3 Dokumentation: Gtk.Button
Das Widget Gtk.Button erzeugt eine Schaltfläche. Wird die Schaltfläche angeklickt, so löst diese Aktion das Signal clicked aus, das mit einer entsprechenden Funktion verknüpft werden kann.
self.button01 = Gtk.Button(label="Klick mich!")
self.button01.connect('clicked', self.on_button01_clicked)
self.box03.pack_start(self.button01, False, False, 0)
Gtk.CheckButton
► GTK+ 3 Dokumentation: Gtk.CheckButton
Das Widget Gtk.CheckButton erzeugt ein Kontrollkästchen. Beim Anklicken dieses Widgets wird das Signal toggled ausgelöst, das mit einer entsprechenden Funktion verknüpft werden kann.
Der Status des Widgets lässt sich mit set_active() festlegen und mit get_active() abfragen.
self.checkbutton01 = Gtk.CheckButton()
self.checkbutton01.set_active(True)
self.checkbutton01.connect('toggled', self.on_checkbutton01_toggled)
self.box02.pack_start(self.checkbutton01, False, False, 0)
print(self.checkbutton01.get_active())
Gtk.RadioButton
► GTK+ 3 Dokumentation: Gtk.RadioButton
Das Widget Gtk.RadioButton erzeugt einen Radiobutton für die Auswahl von genau einer Option aus einer Gruppe von Optionen. Ein Label kann als Argument der Funktion übergeben werden. Die Zusammengehörigkeit verschiedener Optionen zu einer Gruppe wird über new_with_label_from_widget() definiert, wobei als erstes Argument der Name eines der Radiobuttons aus der entsprechenden Gruppe angegeben wird.
Wird eine neue Option ausgewählt, so löst dies das Signal toggled aus, das mit einer entsprechenden Funktion verknüpft werden kann.
Der Status eines Radiobuttons kann mit set_active() eingestellt und mit get_active() abgefragt werden.
self.radiobutton01 = Gtk.RadioButton("Option 1")
self.radiobutton01.connect('toggled', self.on_radiobutton01_toggled)
self.box02.pack_start(self.radiobutton01, False, False, 0)
self.radiobutton02 = Gtk.RadioButton.new_with_label_from_widget(self.radiobutton01, "Option 2")
self.radiobutton02.connect('toggled', self.on_radiobutton01_toggled)
self.box02.pack_start(self.radiobutton02, False, False, 0)
self.radiobutton03 = Gtk.RadioButton.new_with_label_from_widget(self.radiobutton01, "Option 3")
self.radiobutton03.connect('toggled', self.on_radiobutton01_toggled)
self.radiobutton03.set_active(True)
self.box02.pack_start(self.radiobutton03, False, False, 0)
def on_radiobutton01_toggled(self, widget):
print(self.radiobutton01.get_active(), self.radiobutton02.get_active(),self.radiobutton03.get_active())
Gtk.Switch
► GTK+ 3 Dokumentation: Gtk.Switch
Das Widget Gtk.Switch erzeugt einen Schalter für eine An/Aus- bzw. Ja/Nein-Option.
Wird der Schalter betätigt, so löst dies das Signal notify::active aus, das mit einer entsprechenden Funktion verknüpft werden kann.
Der Status des Schalters kann mit set_active() eingestellt und mit get_active() abgefragt werden.
self.switch01 = Gtk.Switch()
self.switch01.connect('notify::active', self.on_switch01_active)
self.switch01.set_active(True)
self.box02.pack_start(self.switch01, False, False, 0)
Gtk.ComboBoxText
► GTK+ 3 Dokumentation: Gtk.ComboBoxText
► Python GTK+ 3 Tutorial: ComboBox
Das Widget Gtk.ComboBoxText erzeugt eine einfache Combobox mit einer Dropdown-Liste zur Auswahl einer Option.
Wird eine Option ausgewählt, so löst dies das Signal notify::active aus, das mit einer entsprechenden Funktion verknüpft werden kann.
Der Index der ausgewählten Option kann mit set_active() eingestellt und mit get_active() abgefragt werden.
self.comboboxtext01 = Gtk.ComboBoxText()
self.comboboxtext01.append_text("Option 0")
self.comboboxtext01.append_text("Option 1")
self.comboboxtext01.append_text("Option 2")
self.comboboxtext01.connect('notify::active', self.on_comboboxtext01_active)
self.comboboxtext01.set_active(1)
self.box02.pack_start(self.comboboxtext01, False, False, 0)
Gtk.SpinButton
► GTK+ 3 Dokumentation: Gtk.SpinButton
Das Widget Gtk.SpinButton erzeugt ein Steuerelement zur Auswahl eines numerischen Wertes, der schrittweise eingestellt werden kann. Der untere und obere Wert wird mit set_range() eingestellt, die Schrittweite für linke und mittlere Maustaste mit set_increments().
Der Wert des Widgets kann mit set_value() eingestellt und mit get_value() abgefragt werden.
Wird der Wert geändert, so löst dies das Signal value-changed aus, das mit einer entsprechenden Funktion verknüpft werden kann.
self.spinbutton01 = Gtk.SpinButton()
self.spinbutton01.set_range(0, 100)
self.spinbutton01.set_increments(1, 10)
self.spinbutton01.set_value(50)
self.spinbutton01.connect('value-changed', self.on_spinbutton01_changed)
self.box02.pack_start(self.spinbutton01, False, False, 0)
Gtk.Scale
► GTK+ 3 Dokumentation: Gtk.Scale
Das Widget Gtk.Scale erzeugt einen Schieberegler zur Auswahl eines numerischen Wertes, der schrittweise eingestellt werden kann. Mit new_with_range() können folgende Parameter als Argumente übergeben werden: Orientierung, unterer Wert, oberer Wert, Schrittweite.
Der Wert des Widgets kann mit set_value() eingestellt und mit get_value() abgefragt werden.
Wird der Wert geändert, so löst dies das Signal value-changed aus, das mit einer entsprechenden Funktion verknüpft werden kann.
self.scale01 = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL, 0, 10, 1)
self.scale01.set_value(4)
self.scale01.set_draw_value(True) # Zeigt Werte neben dem Widget an
self.scale01.connect('value-changed', self.on_scale01_changed)
self.box02.pack_start(self.scale01, True, True, 0)
Gtk.FileChooserButton
► GTK+ 3 Dokumentation: Gtk.FileChooserButton Gtk.FileChooserDialog
► Python GTK+ 3 Tutorial: FileChooserDialog
Das Widget Gtk.FileChooserButton erzeugt eine Schaltfläche, über die ein Dialog zur Auswahl einer Datei bzw. eines Ordners geöffnet werden kann.
Der Wert des Widgets kann mit set_filename() eingestellt und mit get_filename() abgefragt werden.
Wird ein neues Objekt gewählt, so löst dies das Signal file-set aus, das mit einer entsprechenden Funktion verknüpft werden kann.
# Datei auswählen:
self.filechooserbutton01 = Gtk.FileChooserButton()
self.filechooserbutton01.set_title("Wählen Sie eine Datei…") # Titel des Dialogfensters
self.filechooserbutton01.connect('file-set', self.on_filechooserbutton01_fileset)
self.box02.pack_start(self.filechooserbutton01, False, False, 0)
# Ordner auswählen:
self.filechooserdialog02 = Gtk.FileChooserDialog("Wählen Sie einen Ordner…", self, Gtk.FileChooserAction.SELECT_FOLDER, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, "Auswählen", Gtk.ResponseType.OK))
self.filechooserbutton02 = Gtk.FileChooserButton.new_with_dialog(self.filechooserdialog02)
self.filechooserbutton02.connect('file-set', self.on_filechooserbutton02_fileset)
self.filechooserbutton02.set_filename(os.environ['HOME'])
print(self.filechooserbutton02.get_filename())
self.box02.pack_start(self.filechooserbutton02, False, False, 0)
Gtk.ColorButton
► GTK+ 3 Dokumentation: Gtk.ColorButton
► GDK 3 Dokumentation: RGBA Colors
Das Widget Gtk.ColorButton erzeugt eine Schaltfläche zur Auswahl einer Farbe.
Wird die Farbe geändert, so löst dies das Signal color-set aus, das mit einer entsprechenden Funktion verknüpft werden kann.
Der Wert des Widgets kann mit set_rgba() eingestellt und mit get_rgba() abgefragt werden. Dazu wird die Komponente Gdk aus dem Modul gi.repository benötigt.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
...
self.colorbutton01 = Gtk.ColorButton()
self.colorbutton01.set_rgba(Gdk.RGBA(.2, .4, .6))
self.colorbutton01.connect('color-set', self.on_colorbutton01_colorset)
self.box02.pack_start(self.colorbutton01, True, True, 0)
...
def on_colorbutton01_colorset(self, widget):
color = self.colorbutton01.get_rgba()
print(Gdk.RGBA.to_string(color))