Verständnis Frage: Module / Klassen & Referenzen

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
wlfmario
User
Beiträge: 10
Registriert: Donnerstag 28. Juni 2018, 20:04
Wohnort: 192.168.0.1

Ich bin erst zeit ein paar Wochen in Python unterwegs und beschäftige mich gerade mit Modulen / Klassen und den Instanzen dieser !
Ich habe leider nur noch nicht verstanden, wie ich eine Instanz die ich in der Main-Datei (Modul) erstellt habe, dessen Klasse in einer anderen Datei (Modul) liegt wieder an diese übergeben kann, so das ich diese Instanz dort auch benutzen kann.

Bsp:

in der Main Methode habe ich eine Instanz erzeugt von einer Klasse (Frame) die in einer anderen Modul liegt.

Code: Alles auswählen

import MyClass
    ...
    haupt_frame = gui.MyFrame(win)
    haupt_frame.config(bg='blue')
    eingabe_frame = gui.Labelframe(haupt_frame)
    eingabe_frame.config(text='Eingabe')
    ....
Die Klasse die das Frame erzeugt, liegt im Modul MyClass:

Code: Alles auswählen

...
class MyFrame(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
...
Jetzt habe ich in MyClass eine weitere Klasse die Button's erzeugt, mit der ich über Command Frames verstecken oder sichtbar machen möchte.

Code: Alles auswählen

...
class Nav_Button(tk.Button):
    def __init__(self, master):
        # Menü Buttons
        self.hs_button = tk.Button(master,
                                   text='Hauptseite', command=lambda: [eingabe_frame.forget(), self.tree_frame.pack()])
        self.hs_button.pack()
...
Um jetzt die Frames in der Klasse bekannt zu machen, brauchte ich ja die Instanz der erzeugten Frames aus der Main-Datei.
Aber wie übergebe ich diese am besten ?
Im Methodenaufruf oder gibt es noch andere saubere Lösungen wie man dies ohne Globale Variablen lösen kann ?

Ich danke schon mal für eure Antworten.
Gruß Mario
Benutzeravatar
__blackjack__
User
Beiträge: 13250
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@wlfmario: Als erstes mal sollten Module aus der Frage verschwinden, denn die Frage wie man etwas an ein Modul übergibt ist sinnlos weil man nichts an Module übergibt. Man übergibt etwas bei Aufrufen. Und da ist es völlig egal in welchem Modul die Funktion oder Methode definiert wurde wenn man den Aufruf machen kann, hat man ja Zugriff auf die Funktion/Methode.

Ich würde als nächstes denn Sinn von `tk.Button` abzuleiten hier in Frage stellen. Um die Aktion für einen Button zu hinterlegen gibt es das `command`-Argument. Wenn man das Verhalten des Button nicht grundlegend ändert, dann macht ableiten keinen Sinn, sondern ist nur unnötig umständlich.

Und ganz allgemein zur Frage: Ja übergabe als Argument(e) ist die Lösung.

`My` ist in 99,99% der Fälle eine überflüssige Vorsilbe die keine Information enthält und weggelassen werden sollte.

Modulnamen werden klein_mit_unterstrichen geschrieben und `MyClass` als Modulname legt den verdacht nahe, dass es das Modul nur für diese Klasse gibt → Python ist nicht Java; eine Klasse pro Modul ist keine sinnvolle Art Module zu nutzen.

Literale Listen sollte man nicht dazu missbrauchen mehr als einen Ausdruck in eine ``lambda``-Funktion zu quetschen.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Benutzeravatar
wlfmario
User
Beiträge: 10
Registriert: Donnerstag 28. Juni 2018, 20:04
Wohnort: 192.168.0.1

Tausend Dank für deine ausführliche Erklärung, das hat einige Knoten aus dem Hirn gelöst.
Ich würde als nächstes denn Sinn von `tk.Button` abzuleiten hier in Frage stellen. Um die Aktion für einen Button zu hinterlegen gibt es das `command`-Argument. Wenn man das Verhalten des Button nicht grundlegend ändert, dann macht ableiten keinen Sinn, sondern ist nur unnötig umständlich.
Da habe ich mich etwas eingelesen, und denke ich habe verstanden was du meinst.
Oft ist Weniger halt mehr. :)

Und ganz allgemein zur Frage: Ja übergabe als Argument(e) ist die Lösung.
Im Nachhinein, war meine Frage schon fast überflüssig, aber ich hatte wohl den falschen Ansatz im Kopf.

`
My` ist in 99,99% der Fälle eine überflüssige Vorsilbe die keine Information enthält und weggelassen werden sollte.
Auch dies würde ich jetzt so unterschreiben, in ein paar Wochen weiß kein Mensch mehr was was die Klasse oder im Modul passiert ohne aussagekräftigen Namen.
Modulnamen werden klein_mit_unterstrichen geschrieben und `MyClass` als Modulname legt den verdacht nahe, dass es das Modul nur für diese Klasse gibt → Python ist nicht Java; eine Klasse pro Modul ist keine sinnvolle Art Module zu nutzen.
Da habe ich mich vertan, MyClass ist eine Klasse kein Modul.
Das man Modulnamen __modulname__ schreibt, war mir bis jetzt neu und sieht man auch nicht sehr oft.
Literale Listen sollte man nicht dazu missbrauchen mehr als einen Ausdruck in eine ``lambda``-Funktion zu quetschen.
Das habe ich mir zu Herzen genommen und dafür zwei Funktionen geschrieben, so das jeder Button je eine Funktion aufruft.

Die Übergabe der Referenzen funktioniert schon mal sehr gut, auch wenn die Funktionen zum teil nicht das machen was sie sollen.
Da werde ich wohl noch etwas tüfteln und versuchen den Fehler zu finden, ansonsten würde ich gerne noch einmal fragen.

Gruß Mario
Benutzeravatar
/me
User
Beiträge: 3557
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

wlfmario hat geschrieben: Samstag 15. Januar 2022, 18:10 Das man Modulnamen __modulname__ schreibt, war mir bis jetzt neu und sieht man auch nicht sehr oft.
Das war auch nicht gemeint. Namen mit zwei Unterstrichen zu Beginn und am Ende werden häufig von der Python-Sprachspezifikation selber definiert und solche Namen sollte man nicht verwenden. Gemeint war, dass ein Modul z.B. nicht `LedDriver` sondern `led_driver` heißen sollte. Siehe dazu auch die Namenskonventionen im "Style Guide for Python Code".
Benutzeravatar
wlfmario
User
Beiträge: 10
Registriert: Donnerstag 28. Juni 2018, 20:04
Wohnort: 192.168.0.1

/me hat geschrieben: Sonntag 16. Januar 2022, 17:41
wlfmario hat geschrieben: Samstag 15. Januar 2022, 18:10 Das man Modulnamen __modulname__ schreibt, war mir bis jetzt neu und sieht man auch nicht sehr oft.
Das war auch nicht gemeint. Namen mit zwei Unterstrichen zu Beginn und am Ende werden häufig von der Python-Sprachspezifikation selber definiert und solche Namen sollte man nicht verwenden. Gemeint war, dass ein Modul z.B. nicht `LedDriver` sondern `led_driver` heißen sollte. Siehe dazu auch die Namenskonventionen im "Style Guide for Python Code".

Ahh ok Danke !
Antworten