Seite 1 von 1

AttributeError: Aber ich bin mir sicher!

Verfasst: Sonntag 28. Juni 2009, 23:51
von start_with_python
Guten Morgen!

Ich bastele nun ein wenig mit GTK rum. Es gefällt mir. Erste Versuche führten direkt zum Erfolg.

Ich hänge bei der einfachen Abfrage eines Textfelds. Was muss ich denn Abfragen? Ich bilde mir ein, dem Tutorial auf WikiBooks gefolgt zu sein.

Die test2.xml habe ich mit Glade erstellt. Das Textfeld mit dem Namen "entry1" existiert auch garantiert (Textfeld Eigenschaften->Allgemein->Name).
AttributeError: TutorialTextEditor instance has no attribute 'entry1'

Code: Alles auswählen

class TutorialTextEditor:

    def __init__(self):

        builder = gtk.Builder()
        builder.add_from_file("test2.xml")
        self.window = builder.get_object("window")
        builder.connect_signals(self)
        self.window.connect("delete_event", self.on_window_destroy)
        self.window.connect("destroy", self.destroy)
        self.window.set_title("Wir füllen den Titel! Auch wie ist das lustig!")

    def on_window_destroy(self, widget, data=None):
        print "Nutzer geht ins Bett..."
        gtk.main_quit()

    def destroy(self, widget):
        print "Schlaf schön!"
        gtk.main_quit()

    def on_button2_clicked(self, data=None):
        text = self.entry1.get_text()
        self.window.set_title(text)

if __name__ == "__main__":
    editor = TutorialTextEditor()
    editor.window.show()
    gtk.main()
Was übersehe ich?
Grüße und gute Nacht!

Verfasst: Montag 29. Juni 2009, 00:16
von Leonidas
Schonmal ``builder.get_object("entry1")`` versucht? Schließlich bindest du nirgendwo ``entry1`` an deine Klasse und GTK+ macht das natürlich nicht automatisch (warum auch).

Übrigens als Tipp: Erbe von ``object``, dann hast du gleich New-Style-Klassen.

Verfasst: Montag 29. Juni 2009, 12:47
von start_with_python
Leonidas hat geschrieben:Schonmal ``builder.get_object("entry1")``
Ja, das war es!
Gibt es da eine Möglichkeit alle Objekte mit einem mal festzulegen? Oder muss ich tatsächlich jedes einzelne so festlegen?

Verfasst: Montag 29. Juni 2009, 13:11
von Leonidas
Normalerweise will man nicht jedes einzelne Widget an einen Namen binden, da reicht es doch, wenn man nur die bindet, die man haben will. Ggf. kann man aber mit ``get_objects()`` sich das etwas automatisieren lassen. Würde ich aber persönlich nicht machen.

Verfasst: Montag 29. Juni 2009, 13:45
von start_with_python
Ok, danke!

Verfasst: Montag 29. Juni 2009, 14:52
von Dauerbaustelle

Code: Alles auswählen

class Window(gtk.Window):
     def __getattr__(self, name):
         return self.widget_tree.get_widget(name)
Damit hast du Zugriff auf die Widgets auch ohne get_widget(foo).

Da gabs doch mal so eine Metaklasse... *rauskram* Achja, der hier wars.

Gruß