OOP Fragen

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.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Mal eine bescheidene Frage dazu:

Wie kann man denn am besten den Frame "zerstören"?
Einfach wäre es ja mit "del self.frame" aber selbst da passiert bei mir nix.
Hab ich etwas übersehen?
BlackJack

@Kalli87: Übersetze „zerstören” mal auf Englisch und schau Dir an was für Methoden Widgets so besitzen. :-)

``del`` auf einen Namen oder ein Attribut braucht man so gut wie nie.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

naja mit destroy() hab ichs auch schon probiert
"self.frame.destroy()"

Ergebnis war ein Error
AttributeError: 'NoneType' object has no attribute 'destroy'

Und wie der Fehler schon sagt hat das Objekt kein Attribut "destroy"
BlackJack

@Kalli87: Aus irgendwelchen Gründen ist an `self.frame` bei Dir nicht das Wigdet sondern der Wert `None` gebunden. Du hast da also an der Stelle wo Du `self.frame` zuweist einen Fehler im Programm. Wahrscheinlich bindest Du da den Rückgabewert einer Layout-Methode des Widgets statt das Widget selber an das Attribut `frame`. Ist ein beliebter Anfängerfehler.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Eigentlich simple angelegt

Code: Alles auswählen

self.lframe = Frame(root, name='lframe').grid()
Dann hat jeder Button und jedes Eingabefeld den Frame bekommen
und den "destroy"-Befehl hab ich halt bei der if-Abfrage gesetzt wenn der Login erfolgreich war
BlackJack

@Kalli87: Da haben wir ja den Fehler. Du bindest nicht das `Frame`-Objekt an `self.lframe` sondern den Rückgabewert von dem `grid()`-Aufruf. Und der ist `None`. Und `None` hat natürlich keine `destroy()`-Methode.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Alles klar :)
Hab es behoben jetzt is der Frame weg und ich bin zufrieden :)

Darauf bin ich echt nicht gekommen, hatte .grid() schon weg gelassen aber da ging nix mehr
aber stimmt schon bei den den Entry-Feldern hab ichs auch in getrennt geschrieben :)

Naja wie immer den Wald vor lauter Bäumen nicht gesehen ;)

Danke
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Seit gegrüßt :)

mal ne kurze frage an euch

Snafu hatte mal dieses Beispiel hier gepostet damit
mein "Copy&Paste" nreduziert wird

Code: Alles auswählen

    def create_frame_new_customer(notebook, font='Helvetica 13 bold'):
        frame = Frame(notebook, name='tab-kunde-neu')
        label_data = [
            ('Titel', 1, 0),
            ('Name', 1, 2),
            # usw
        ]
        for text, row, column in label_data:
            Label(frame, text=text, font=font).grid(row=row, column=column)
        return frame
Mein Frage dazu ist, ob es auch möglich wäre es auch für "Entry" Felder
umzusetzen.

Ich hab es mal probiert bin aber daran gescheitert.

Gruß Kalli
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kalli87 hat geschrieben: Ich hab es mal probiert bin aber daran gescheitert.
Was hast Du denn probiert? (Code?) Und was ging schief? (Fehler? Unerwartetes Ergebnis?)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Keine Fehlermeldung eher gar keine Ausgabe von den Entry-Feldern

so sind zur zeit meine Entry-Felder aufgebaut

Code: Alles auswählen

self.ausgabetitel = Entry(self.tab_kunde, font=10)
self.ausgabetitel.grid(row=3, column=0, padx=5)
so is es normal und funktioniert.
Möchte aber nun das ganze, wie es Snafu gepostet hatte, umsetzen.

Ps.: Nen Beispielcode hab ich nicht mehr vorhanden da ich das ganze verworfen hatte
und mich um den anderen Code gekümmert habe. Aber ich wollte das ganze jetzt bissl
optimieren bzw. vereinfachen
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Hier mal ein kleines Beispiel
was ich so rekonstruieren konnte wie ichs mal
versucht hatte

Code: Alles auswählen

        entry_data =\
            [
                (self.ausgabetitel,10),
                (self.ausgabename,10)
            ]
        grid_data =\
            [
                (self.ausgabetitel, 3,0,5),
                (self.ausgabename,3,1,5)
            ]
        for ausgabeentry, font in entry_data:
            ausgabeentry = Entry(self.tab_kunde, font=font)
            
        for ausgabegrid, row, column, padx in grid_data:
            ausgabegrid.grid(row=row, column=column, padx=padx)
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

gut hat sich erledigt ;)

Code: Alles auswählen

entry_data =\
            [
                ("self.ausgabetitel",10,3,0,5)
            ]

        for ausgabeentry, font, row, column, padx in entry_data:
            ausgabeentry = Entry(self.tab_kunde, font=font)
            ausgabeentry.grid(row=row, column=column, padx=padx)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das ist ein sehr umständlicher Weg zum Füllen von "entry_data". Der Backslash ist in den meisten Fällen nicht nötig, da noch offene Klammern die logische Zeile fortführen. So geht es schöner:

Code: Alles auswählen

data = [element]
oder bei mehreren Elementen:

Code: Alles auswählen

data = [
    spam,
    ham,
    eggs]
Das Leben ist wie ein Tennisball.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

danke für den Hinweis
Hab gerade gemerkt das wenn ich jetzt anfange den Code
zu optimieren bzw. zu vereinfachen das sich Haufen Probleme
entstehen :?
Antworten