GtkWidget key-press-event geht verloren

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Ich habe eine GTK3, Glade, Python Anwendung in der das 'key-press-event' auf Window Ebene zugewiesen ist. Ich muss alle gedrückten Tasten erkennen können; insbesondere 'Tab', 'Backspace', 'Delete'. Die gedrückten Keys werden alle brav erkannt und gemeldet solange das Focus Widget, z.B. Gtk.Entry oder Gtk.Textview die Taste nicht selbst verarbeitet. Sobald ich in einem 'editable' Widget bin, wird das 'key-press-event' nicht mehr ausgelöst.

Wie weiss ich dennoch welche Taste gedrückt wurde?
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Ich habe festgestellt, dass das Problem nur bei Glade besteht. Macht man das GUI per Hand in Python, werden alle Tastendrücke erkannt und via key-press-event gemeldet. Bei einem Glade GUI 'fressen' die Editables (z.B. Gtk.Entry) die Signals der Tastendrücke. Der Event-Handler key-press-event bekommt nur noch die Tastendrücke mit, mit denen das Editable-Widget nichts anfangen kann, z.B. F-Tasten. Alle anderen, z.B. Buchstaben, DEL, BACK usw. werden vom Widget 'gefressen'.

Wie man das Problem löst, weiss ich aber immer noch nicht.
lunar

@rhersel: Vergleiche doch mal die Widget-Hierarchie von Glade mit der Deines Quelltexts...
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Die Widget Hierarchie ist in beiden Fällen exakt die gleiche. Ich mache es jetzt ohne Glade und alles funktioniert. Ausserdem habe ich festgestellt, dass man ohne Glade schneller entwickelt weil man sich das ständige Hin-und-her zwischen Glade und dem Code Editor spart.
lunar

@rhersel: Auf der anderen Seite muss man das Programm öfter ausführen, um das Aussehen der Benutzerschnittstelle zu überprüfen. Man sieht dem Quelltext ja nicht an, wie das Resultat aussieht.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Ich glaube, hier zählt der subjektive Eindruck mehr als die objektive Argumentation. Für mich fühlt sich die Entwicklung schneller an wenn ich nur im Sourcecode arbeite.

Trotzdem mal die Signal-Programmierung als Beispiel:
Mit Glade
- zum Widget navigieren
- Signal in der Liste suchen
- Name des Signals vergeben
- Name kopieren
- Im Code Eventhandler programmieren

Nur mit Sourcecode
- zur richtigen Stelle im Code navigieren
- Widget mit dem Signal connecten
- Eventhandler programmieren

Bei diesem Beispiel fühle ich mich im Code dreimal schneller als mit Glade. Ausserdem kann man den Code für die Signal-Connects an einer Stelle zusammenfassen, so dass es schön übersichtlich bleibt. Bei Glade artet das zu einer wilden Klick-Orgie aus.

Für die grafische Gestaltung des GUIs ist sicher Glade die erste Wahl. Aber sobald es ins Detail geht (Properties und Signals) ist man im Code schneller.
Antworten