Objekt in Funktion zur Laufzeit erstellt - global nutzen

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
rumpelstilzchen
User
Beiträge: 2
Registriert: Dienstag 26. April 2022, 06:43

Hallo,

als Anfänger fehlen mir evtl. nur die richtigen Suchbegriffe; ich habe folgendes vor:

Ich habe eine Klasse definiert. Ich nutze tkinter und habe mittels Menuleiste ein neues Fenster erstellt. In diesem Fenster tätige ich mehrere Einstellungen (Checkbutton usw) und mit einem Buttondruck will ich diese Daten speichern (mit einem Objekt der definierten Klasse). Im restlichen Verlauf des Programms möchte ich dieses Objekt jetzt nutzen können (global). Aktuell kennt mein Code das Objekt außerhalb meiner Buttonfunktion nicht. Am besten per Codebeispiel:

Die Klasse:

Code: Alles auswählen

class createSpieler():
    def __init__(self, name, alter):
        self.name = name
        self.alter = alter
Die Buttonfunktion:

Code: Alles auswählen

def clickButton():
	#neues Fenster wird erstellt
	global superfrage
	def getDaten():
		if superfrage:
			Spieler1 = createSpieler('Hans', 63)
Und nun möchte ich dieses Objekt Spieler1 nutzen, quasi als globale und dauerhaften Einstellungen für die restliche Anwendung. (Ich bekomme übrigens nur die Meldung "NameError: name 'Spieler1' is not defined")

Ich habe natürlich auch ein wenig herumprobiert, komme nur immer an den gleichen Fehler:
z.B. habe ich getDaten() rausgeholt und drüber definiert, dann in der clickButton() mit dem Funktionsaufruf getDaten('Hans',63) als Parameter übergeben:

Code: Alles auswählen

def getDaten(name, alter):
	global superfrage
    	if superfrage:
        	Spieler1 = createSpieler('Hans', 63)

def clickButton():
    global superfrage
    superfrage = True
    getDaten('Hans',63)

Brachte ebenfalls keinen Erfolg.

Wonach suche ich hier oder gibt es eine schnelle Lösung, die ich übersehe/nicht kenne? Ich vermute eine Lösung mit Parametern!?

Vielen dank für eure Mühe!
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Lösung heißt Klassen; Du benutzt ja schon eine Klasse für den Spieler. Schreibe eine Klasse für die GUI, dann kansnt Du dort ohne weiteres ein Attribut `spieler` anlegen, und in allen Methoden benutzen.

Klassen werden nach Zuständen benannt, nicht nach Tätigkeiten, also `Spieler` statt `CreateSpieler`.
Generische Namen sind schlecht, getDaten, welche Daten? Und die Funktion liefert gar nichts, also warum get?
Funktionen und Variablennamen werden komplett klein geschrieben.
Eingerückt wird immer mit 4 Leerzeichen, niemals mit Tabs, oder Tabs und Leerzeichen gemischt.
Vergiss dass es `global` überhaupt gibt, globale Variablen benutzt man nicht; statt dessen kapselt man den Zustand der GUI in einer Klasse.
rumpelstilzchen
User
Beiträge: 2
Registriert: Dienstag 26. April 2022, 06:43

Hi, danke für die Antwort!
Die Lösung heißt Klassen; Du benutzt ja schon eine Klasse für den Spieler. Schreibe eine Klasse für die GUI, dann kansnt Du dort ohne weiteres ein Attribut `spieler` anlegen, und in allen Methoden benutzen.
habe es anders gelöst, aber deine Antwort war der Denkanstoß.

Ich hatte eher ein strukturelles Problem im Kopf (ich komme eher aus nicht objektorienterten Gefilden), falls man das so sagen kann. Es war natürlich Käse in den Methoden meine Objekte zu erstellen. Jetzt erstelle ich sie zuerst als Dummy und kann Sie in den Methoden dann füllen.. Also läuft wie es soll.
Klassen werden nach Zuständen benannt, nicht nach Tätigkeiten, also `Spieler` statt `CreateSpieler`.
Natürlich korrekt, im richtigen Code ist das auch so. Hier wollte ich gleichzeitig meine Intention verdeutlichen, war aber bestimmt unnötig :mrgreen:
Generische Namen sind schlecht, getDaten, welche Daten? Und die Funktion liefert gar nichts, also warum get?
Auch hier dem Beispiel geschuldet und natürlich passiert da mehr als im oben gezeigten Code. Dennoch werde ich da nochmal drüberschauen, danke!
Funktionen und Variablennamen werden komplett klein geschrieben.
Da schludere ich für meine subjektive Lesbarkeit, mal schauen ob ich meine Marotten loswerde. (Ist ja zum Glück nur privat und eher die Ausnahme, dass ich Python nutze :mrgreen: )
Eingerückt wird immer mit 4 Leerzeichen, niemals mit Tabs, oder Tabs und Leerzeichen gemischt.
Ah PyCharm macht das für Faule wie mich automatisch; habe ich im Code-Bracket oben nicht mehr drauf geachtet :oops:
Vergiss dass es `global` überhaupt gibt, globale Variablen benutzt man nicht; statt dessen kapselt man den Zustand der GUI in einer Klasse.
Versuche ich zu beherzigen, danke!
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

rumpelstilzchen hat geschrieben: Dienstag 26. April 2022, 09:00 Hi, danke für die Antwort!Jetzt erstelle ich sie zuerst als Dummy und kann Sie in den Methoden dann füllen.. Also läuft wie es soll.
Das klingt sehr falsch und als würdest du weiter globale Dinge verwenden.
Wie man es richtig macht wurde dir von Sirius3 ja erklärt.
Antworten