Fenster erscheint nicht

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Jack_Rasp
User
Beiträge: 4
Registriert: Donnerstag 7. Mai 2020, 09:36

Donnerstag 7. Mai 2020, 09:44

Hallo zusammen!

Habe gestern und heute viel gesucht , viel gefunden, aber mein Problem kann ich leider nicht lösen...

Code: Alles auswählen


#!/usr/bin/env python

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class Example:

        def __init__(self):
                self.builder = Gtk.Builder()
                self.builder.add_from_file("N1intercom.glade")
                #self.builder.connect_signals()
        
                self.win = self.builder.get_object("color_menu")
        
                self.win.show()

Gtk.main()


Soweit so simpel. Ja, ich bin Anfänger... Solange ich die Initiierung mit self weglasse funktioniert alles, und das kleine Fenster erscheint:

Code: Alles auswählen


#!/usr/bin/env python

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


builder = Gtk.Builder()
builder.add_from_file("N1intercom.glade")

        
win = builder.get_object("color_menu")
        
win.show()
Gtk.main()


Da ich jetzt die Signale verknüpfen möchte brauche, ich __init__, glaube ich. Zumindest war das in allen Beispielen so.

Helft einem Newbe!!


Danke!


Gruß
Jack
Jack_Rasp
User
Beiträge: 4
Registriert: Donnerstag 7. Mai 2020, 09:36

Donnerstag 7. Mai 2020, 11:21

Ich vergaß zu schreiben, was das Problem ist ...

beim Ausführen des ersten Codes öffnet sich nur ein shell Fenster, welches komplett schwarz bleibt...

Wie gesagt, beim zweiten geht das Fenster wunderbar auf.


Gruß
Jack
Benutzeravatar
sparrow
User
Beiträge: 1839
Registriert: Freitag 17. April 2009, 10:28

Donnerstag 7. Mai 2020, 11:45

Du packst in der ersten Veriante alles in eine Klasse, initialisierst die aber nicht.
Automagisch passiert da nichts. Die Klasse zu implementieren ohne sie zu instanzieren hat den selben Effekt wie diese Klasse gar nicht zu haben.

Klassen werden in der Python Dokumentation ausgiebig behandelt.
Jack_Rasp
User
Beiträge: 4
Registriert: Donnerstag 7. Mai 2020, 09:36

Donnerstag 7. Mai 2020, 13:04

Moin Sparrow

und Danke schon mal für den Link!

Bei unserer Namenskombo musstest Du ja auf meinen Beitrag Antworten :lol:

Kannst Du mir bitte noch etwas konkreter helfen und mir sagen, was da hin muss. Ich lese dann auch noch die Doku! Muss nur gerade mal etwas vorankommen - Motivationskurve und so...


Danke!!
Jack_Rasp
User
Beiträge: 4
Registriert: Donnerstag 7. Mai 2020, 09:36

Donnerstag 7. Mai 2020, 22:19

Hallo zusammen,

läuft jetzt indem ich das komplett umgeschrieben habe.

Code: Alles auswählen


#!/usr/bin/env python

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class Handler:
        
        
        # schliesst das Main Window und beendet das Programm
        
        def win_quit(self, *args):
                Gtk.main_quit()
        
        # oeffnet das Untermenue
       
        def button(self, button):
                builder.get_object("13win").show_all()
                
        # schliesst das 2 Window und kehrt zum ersten zurueck
        
        def win2_quit(self, *args):
                builder.get_object("13win").destroy()
        
                
builder = Gtk.Builder()
builder.add_from_file("12.glade")
builder.connect_signals(Handler())   
  
win = builder.get_object("12win")
        
win.show()


Gtk.main()

Jetzt habe ich aber ein weiteres Problem. Wie Ihr seht, möchte ich über einen Button, ein weiteres Fenster aufmachen. Dieses soll dann geschlossen und dann über den Button ein weiteres Mal aufgerufen werden können.

Und genau das passiert nicht sauber. Der Inhalt des zweiten Fensters wird nicht mehr dargestellt und wenn man reinklickt kommt in der Shell folgende Meldung:

Code: Alles auswählen


(12.py:3956): Gtk-CRITICAL **: 23:16:05.704: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.704: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.705: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.705: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.705: gtk_widget_get_settings: assertion 'GTK_IS_WIDGET (widget)' failed
/usr/lib/python2.7/dist-packages/gi/overrides/Gtk.py:1641: Warning: g_object_get: assertion 'G_IS_OBJECT (object)' failed
  return _Gtk_main(*args, **kwargs)

(12.py:3956): Gtk-CRITICAL **: 23:16:05.707: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.707: gtk_widget_translate_coordinates: assertion 'GTK_IS_WIDGET (dest_widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.768: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.768: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed

(12.py:3956): Gtk-CRITICAL **: 23:16:05.768: gtk_widget_get_window: assertion 'GTK_IS_WIDGET (widget)' failed



Habe mal gelesen, dass beim schließen eines Fensters die Settings gespeichert werden. Hat das damit zu tun? Schreibrechte oder so?

Würde mich freuen, wenn mir da einer weiterhilft!

Gruß
Jack
Benutzeravatar
__blackjack__
User
Beiträge: 6012
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 8. Mai 2020, 02:06

@Jack_Rasp: Eingerückt wird in Python mit vier Leerzeichen pro Ebene.

Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Damit gibt es dann keine globalen Variablen mehr und `Handler` müsste dann auch zu einer echten, sinnvollen Klasse gemacht werden und nicht nur eine Sammlung von Funktionen die in eine Klasse gesteckt wurden.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import gi  # isort:skip

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class Handler:
    def __init__(self, builder):
        self.builder = builder

    @staticmethod
    def win_quit(*_args):
        """
        Schliesst das Main Window und beendet das Programm.
        """
        Gtk.main_quit()


    def button(self, _button):
        """
        Öffnet das Untermenü.
        """
        self.builder.get_object("13win").show_all()


    def win2_quit(self, *_args):
        """
        Schliesst das 2. Window und kehrt zum ersten zurück.
        """
        self.builder.get_object("13win").destroy()


def main():
    builder = Gtk.Builder()
    builder.add_from_file("12.glade")
    builder.connect_signals(Handler(builder))

    window = builder.get_object("12win")
    window.show()
    Gtk.main()


if __name__ == "__main__":
    main()
Was das `destroy()` angeht: Hast Du mal gelesen was das macht? Da sollte eigentlich klar sein, dass man das Fenster dann nicht mehr anzeigen kann. Das Gegenteil von zeigen ist halt nicht zerstören, sondern verstecken.
long long ago; /* in a galaxy far far away */
Antworten