TypeError bei Daten an pygtk-Fenster weitergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
michote
User
Beiträge: 6
Registriert: Donnerstag 13. September 2007, 09:30
Kontaktdaten:

Hallo,
Ich habe mich nach einer Weile endlich mal wieder aufgemacht was zu programmieren und mich endlich mal an GUIs gewagt. Dabei bin ich auf quickly gestossen und komm damit bisher sehr gut zurecht.

Jetzt bin ich dabei einen Bearbeitungsdialog meiner Datensätze zu schreiben.
Dafür muss ich die Daten vom Hauptfenster ins Bearbeitenfenster weitergeben, was ich nach etwas basteln durch Ergänzung der __init__ - Funktion des Bearbeiungsfensters auch hinbekommen habe.

leider bekomme ich trotzdem (obwohl die daten da sind, und das Skript nicht abbricht) immer noch ein TypeError (s.u.),
den ich nicht einordnen kann.
Beim Suchen bin ich nur darauf gestossen, das es irgendwas it einer Superklasse zu tun hat, habe aber keine Lösung gefunden.

Nun also der Code und schonmal vielen Dank fürs reindenken.

die Klasse des Bearbeitungsfensters:

Code: Alles auswählen

class EditDialog(gtk.Dialog):
    __gtype_name__ = "EditDialog"
    _data= ''

    def __init__(self, data, parent=None):
        pass

    def __new__(cls, data, p=None):
        builder = get_builder('EditDialog')
        new_object = builder.get_object('edit_dialog')
        new_object.finish_initializing(builder, data)
        
        return new_object

    def finish_initializing(self, builder, data):+
        self.builder = builder
        self.builder.connect_signals(self)
        self._data = data
        self.set_data(self._data)

    def set_data(self, d):
        print 'set: '
        print d['thema']

    def get_changes(self):
        print 'changes: ', self._data['thema']
Starten tue ich das ganze vom Hauptfenster folgendermaßen:

Code: Alles auswählen

    def edit(self, widget, data=None):
        d = {'thema': 'Thema'}
        edit = EditDialog.EditDialog(d, None)
        result = edit.run()
        data = edit.get_changes()
        edit.destroy()
        if result != gtk.RESPONSE_OK:
            return
        else:
            print data

Code: Alles auswählen

TypeError: __init__() takes at least 2 arguments (1 given)
set: 
Thema
...
Let us noch a word verstehn, it goes me on the Geist,
und gib, dass “Microsoft” bald wieder “Kleinweich” heißt.
Wise Guys - Radio
BlackJack

@michote: Ein Klassenattribut `_data`, eine leere `__init__()`, `__new__()`!? Das sieht alles etwas komisch bis verwirrend aus. Wie sieht denn der komplette Traceback aus?
Benutzeravatar
michote
User
Beiträge: 6
Registriert: Donnerstag 13. September 2007, 09:30
Kontaktdaten:

Ich kriege keinen Traceback das ist ja da komische.
ich kriege das nur immer in der Ausgabe.

eigentlich kommt die Klasse ganz ohne eigene __init__ aus, die habe ich nur hinzugefügt um daten an die Klasse weiterzugeben.
die __new__ setzt mir über die builder Funktion meinen .ui-file aus Glade aus. Das funktioniert auch alles einwandfrei. (das hat alles quickly für mich aufgesetzt)

Irgendwas scheint mit der Vererbung von gtk.Dialog der __init__ nicht zu stimmen

_data würde ich gerne mit meinen Daten zuweisen.
Let us noch a word verstehn, it goes me on the Geist,
und gib, dass “Microsoft” bald wieder “Kleinweich” heißt.
Wise Guys - Radio
BlackJack

@michote: Aber Du gibst doch gar keine Daten an die Klasse weiter über die `__init__()`. Die Frage ist doch womit oder ob die Überhaupt aufgerufen wird, denn das magische Zeugs in der `__new__()` hat ja erst einmal Vorrang. Hast Du das geschrieben? Oder wurde das irgendwie generiert? Von wem?

Das mit `_data` habe ich nicht verstanden? Du willst das doch sicher nicht einem *Klassen*attribut zuweisen!? Also was soll das da?
Benutzeravatar
michote
User
Beiträge: 6
Registriert: Donnerstag 13. September 2007, 09:30
Kontaktdaten:

ich gebe das dictionary d (was ich gekürzt habe) an die Funktion weiter.
Ich wollte eigentlich die Daten einer Klassenvariablen zuweisen damit ich klassenweit darauf zugreifen kann, was ist den der Unterschied zum Attribut?
__new__ hat wie gesagt das programm quickly für mich generiert.
hab es versucht um die daten zu ergänzen sah vorher so aus:

Code: Alles auswählen

    def __new__(cls):
        builder = get_builder('AddDialog')
        new_object = builder.get_object('add_dialog')
        new_object.finish_initializing(builder)
        return new_object
Und es gab keine __init__ funktion
über das zuweisen unter __init__ habe ich immer verschiedene Fehler bekommen aber nur über __new__ hat es auch nicht funktioniert

Vielleicht habe ich aber auch einfach ein Brett vorm Kopf und irgendwas grundlegendes nicht verstanden.
Let us noch a word verstehn, it goes me on the Geist,
und gib, dass “Microsoft” bald wieder “Kleinweich” heißt.
Wise Guys - Radio
BlackJack

@michote: Wieso willst Du die Daten an die Klasse binden und nicht an das Exemplar? Was heisst für Dich "klassenweit"? Ist Dir überhaupt klar was eine Klasse ist? Und was ein Exemplar (englisch: "instance")?

Du müsstest verstehen wie `__new__` beim Erzeugen eines Exemplars ins Spiel kommt. Ich müsste das selbst nachlesen, weil's "magisch" ist und man das eigentlich so gut wie nie benötigt. Das habe ich vor Jahren mal benutzt um das Singleton-Entwurfsmuster zu implementieren. Sonst ist mir noch kein vernünftiger Grund untergekommen das zu benutzen. Und selbst bei Singletons bin ich mittlerweile davon weg, und erstelle einfach nur *ein* Exemplar ohne es unbedingt erzwingen zu wollen, das jemand der sich in den Fuss schiessen möchte, *doch* ein weiteres Exemplar erstellt.
Benutzeravatar
michote
User
Beiträge: 6
Registriert: Donnerstag 13. September 2007, 09:30
Kontaktdaten:

ok danke für deine Hilfe, werde versuchen mich da noch ein bisschen weiter einzulesen.
Und vielleicht finde ich ja noch irgendwo Beispielcode wie ich das korrekt umsetzen kann.
Let us noch a word verstehn, it goes me on the Geist,
und gib, dass “Microsoft” bald wieder “Kleinweich” heißt.
Wise Guys - Radio
Antworten