Seite 1 von 1

GTK4 Signal-Handler werden nicht gefunden

Verfasst: Donnerstag 18. Mai 2023, 18:18
von AlterSack
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

Re: GTK4 Signal-Handler werden nicht gefunden

Verfasst: Donnerstag 18. Mai 2023, 18:45
von __deets__
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.

Re: GTK4 Signal-Handler werden nicht gefunden

Verfasst: Donnerstag 18. Mai 2023, 18:52
von Axel-WAK
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()

Re: GTK4 Signal-Handler werden nicht gefunden

Verfasst: Donnerstag 18. Mai 2023, 22:09
von AlterSack
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

Re: GTK4 Signal-Handler werden nicht gefunden

Verfasst: Freitag 19. Mai 2023, 11:31
von AlterSack
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?

Re: GTK4 Signal-Handler werden nicht gefunden

Verfasst: Freitag 19. Mai 2023, 11:53
von __blackjack__
@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.

Re: GTK4 Signal-Handler werden nicht gefunden

Verfasst: Freitag 19. Mai 2023, 12:03
von __deets__
Es gibt etwas, das nennt sich "scope", und ggf geht das dann damit irgendwie, siehe: https://docs.gtk.org/gtk4/iface.BuilderScope.html

Re: GTK4 Signal-Handler werden nicht gefunden

Verfasst: Freitag 19. Mai 2023, 16:10
von AlterSack
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