GTK4 Signal-Handler werden nicht gefunden

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
AlterSack
User
Beiträge: 5
Registriert: Montag 20. Dezember 2021, 16:36

Bin seit Tagen am Suchen. Was läuft hier falsch???
app.py:

Code: Alles auswählen

import gi, sys
gi.require_version("Gtk", "4.0")
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw

class MyApp(Adw.Application):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.connect('activate', self.on_activate)

    def on_activate(self, app):
        app.add_window(win)
        win.present()

    def onButtonPressed(self, button):
        print("Kukuk!")

builder = Gtk.Builder.new_from_file('app.ui')

win = builder.get_object("window1")
app = MyApp(application_id=None)
print("MyApp:",dir(app))
app.run(sys.argv)
app.ui:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="4.6"/>
  <object class="GtkApplicationWindow" id = "window1">
    <property name="can-focus">False</property>
    <property name="title" translatable="yes">Application</property>
    <child>
      <object class="GtkButton" id="button1">
        <property name="label" translatable="yes">button</property>
        <property name="visible">True</property>
        <property name="can-focus">True</property>
        <property name="receives-default">True</property>
        <signal   name="clicked" handler="onButtonPressed" swapped="no"/>
      </object>
    </child>
  </object>
</interface>
System-Ausgabe:

Code: Alles auswählen

(process:10943): Gtk-ERROR **: 19:13:58.835: failed to add UI from file application.ui: No function named `onButtonPressed`.
Trace/breakpoint trap (core dumped)
Wäre dankbar für'n Tipp
:geek: Alter Sack
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich kenne GTK nicht, aber das im XML definierte Signal muss beim Laden wohl irgendwie auffindbar sein. Ist es aber nicht. Schmeiß das also erstmal raus, oder such nach einer Methode, wie man das App-Objekt übergeben kann beim instantiieren.
Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

Geht es so?

Code: Alles auswählen

    def on_activate(self, app):
        button1 = builder.get_object("button1")
        button1.connect("clicked", self.onButtonPressed)
        app.add_window(win)
        win.present()
OS: LMDE5 *** Homepage *** Github Seite
AlterSack
User
Beiträge: 5
Registriert: Montag 20. Dezember 2021, 16:36

Vielen Dank für die Antworten.

Aber hier steht:
https://docs.gtk.org/gtk4/migrating-3to ... pi-changes

Adapt to GtkBuilder API changes
gtk_builder_connect_signals() no longer exists. Instead, signals are always connected automatically....

Dieser Automatismus ist aber nirgends näher definiert. Natürlich ist es egal, ob ich die Signale im Programm oder im 'UI'-File vornehme. Aber wenn ich schon mal beim 'UI'-Entwurf bin, währe es doch chick, die Signal-Handler gleich mit zu definieren.
Das scheint aber mit meinem Test-Programm nicht zu funktionieren. Im Namensraum von 'MyApp' sind die beiden Signal-Handler bekannt. Vermutlich ist aber dieser Namensraum dem 'Builder-Object' nicht bekannt.
Frage: Wie kann ich ihn bekannt machen? Wer hat einen Rat?

Danke - Alter Sack
AlterSack
User
Beiträge: 5
Registriert: Montag 20. Dezember 2021, 16:36

Ja. Vielen Dank Axel.
Du hast ganz recht, so geht's natürlich. Aber welchen Sinn bitteschön hat dann das <signal> Element im UI-File?
Benutzeravatar
__blackjack__
User
Beiträge: 13219
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@AlterSack: Da kann man Signal-Handler angeben. Also Funktionen. In C geschrieben. Wenn man das von C aus verwendet. Weil Gtk ein in C geschriebenes GUI-Rahmenwerk ist. Das ist ja auch die Dokumentation für C. Ob und wie eine Anbindung an eine andere Programmiersprache da irgend etwas mit anstellt, ist eine Frage dieser Anbindung.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt etwas, das nennt sich "scope", und ggf geht das dann damit irgendwie, siehe: https://docs.gtk.org/gtk4/iface.BuilderScope.html
AlterSack
User
Beiträge: 5
Registriert: Montag 20. Dezember 2021, 16:36

Danke __deets__ & __blackjack__,
scheint wohl keine unkomplizierte Lösung mit Python zu geben.
Werde dann wohl

Code: Alles auswählen

button.connect(signal,handler)
benutzen.
dank & bye - Alter Sack
Antworten