Auf aktuell erstelltes Objekt aus anderer Klasse zugreifen

Fragen zu Tkinter.
Antworten
Lutuquox
User
Beiträge: 5
Registriert: Samstag 10. Dezember 2016, 21:23

Hallo,

ich werde mein Problem vereinfacht darstellen: Ich habe zwei Klassen:

Code: Alles auswählen

class MainWindow():
    def __init__(self):
        root = Tk()
        self.box = Listbox(root)
        mainloop()

class BlaBla:
    def __init__(self):
        self.attribut = start_object.box.get(1)

start_object = MainWindow()
Jetzt meckert er, dass die Variable start_object nicht existieren würde. Vermutlich, weil das Fenster noch offen ist und er in der mainloop steckt...... Wie kann ich trotzdem aus einer anderen Klasse auf die Listbox des start_object zugreifen? Überhaupt nicht? Muss ich aus der doofen Listbox ein KLASSENattribut machen? Geht das irgendwie elegant innerhalb der init Funktion? ... Bin echt verzweifelt
Zuletzt geändert von Anonymous am Mittwoch 4. Januar 2017, 21:58, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Lutuquox: Die Hauptschleife wird üblicherweise als *letztes* in der Haupt*funktion* des Programms aufgerufen. Und nicht in einer `__init__()`-Methode. Von der erwartet man auch üblicherweise das sie endet damit an der Stelle wo das Exemplar erstellt wurde, auch irgend etwas damit gemacht werden kann. Sonst ist der Sinn einer Klasse an der Stelle zumindest fragwürdig. Das `Tk`-Exemplar wird üblicherweise auch in der Hauptfunktion erstellt.

Selbst wenn der Name `start_object` an der Stelle wo Du ihn verwendest bereits an das Objekt gebunden wäre, sollte die `BlaBla.__init__()` da nicht einfach so auf magische Weise drauf zugreifen wollen und eigentlich sollte sie das auch gar nicht können, denn auf Modulebene hat `start_object` gar nichts zu suchen. Was Funktionen und Methoden an Werten verwenden (ausser Konstanten) sollte als Argument übergeben werden.

Zu Klassenattributen sollte man nur Konstanten machen und keine Variablen. Denn sonst sind das am Ende semantisch doch wieder globale Variablen die man durch Klassen nicht mehr benötigen sollte.
Lutuquox
User
Beiträge: 5
Registriert: Samstag 10. Dezember 2016, 21:23

@BlackJack
Auweia....... Unser Prof hat uns ein Beispiel mit tkinter geschickt und da wurden in der init-Funktion alle Widgets erstellt und dann noch innerhalb der init am Ende die mainloop gestartet, also habe ich es auch so gemacht..... Ich muss zugeben, der gesamte Sinn der Objektorientierung, sprich der Klassen, ist komplett an mir vorbeigegangen. Alles, was ich bisher objektorientiert programmiert habe, hätte ich prozedural eleganter hinbekommen.....

Habe Deine Kritikpunkte ungefähr verstanden, aber weiß nicht, wie man es besser macht... Kannst Du mir diesbezüglich irgendwas zum Lesen empfehlen, das das erklärt? Danke!!
BlackJack

@Lutuquox: GUIs in Python ”prozedural” zu programmieren ist sicher nicht elegant, wahrscheinlich nicht mal wirklich möglich ohne es *richtig* unsauber werden zu lassen. Da muss schon mindestens funktional programmiert werden, was aber in Python gegenüber Sprachen die tatsächlich mit dem funktionalen Paradigma im Hinterkopf entworfen wurden, auch schon nicht so richtig gut funktioniert, und Python ist nun mal eine objektorientierte Programmiersprache.

Irgendetwas ”kompaktes” und auch noch Python-spezifisches zum Lesen fällt mir da jetzt nicht ein. Die Punkte waren ja sehr allgemein, also letztlich ja nur zwei Sachen: 1. das Objekte auch benutzt werden sollten, also eine `__init__()` dazu da sein sollte ein Objekt zu hinterlassen das ein für den Aufrufer sinnvoll nutzbar initialisiertes Objekt hinterlässt, mit dem der dann etwas machen kann. 2. keine globalen Variablen. Letzteres ist ja nicht mal spezifisch für objektorientierte Programmierung, das gilt auch für andere Paradigmen.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@Lutuquox:
Dieser Link bzgl OOP und Tkinter hilft viell. schon etwas weiter:
OOP in Python

Ansonsten findet man bei Google unter "Python OOP tkinter" schon ein paar Kleinigkeiten.

Gruß Seb
Antworten