Seite 1 von 1

Objekt in Funktion zur Laufzeit erstellt - global nutzen

Verfasst: Dienstag 26. April 2022, 07:16
von rumpelstilzchen
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!

Re: Objekt in Funktion zur Laufzeit erstellt - global nutzen

Verfasst: Dienstag 26. April 2022, 07:46
von Sirius3
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.

Re: Objekt in Funktion zur Laufzeit erstellt - global nutzen

Verfasst: Dienstag 26. April 2022, 09:00
von rumpelstilzchen
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!

Re: Objekt in Funktion zur Laufzeit erstellt - global nutzen

Verfasst: Dienstag 26. April 2022, 09:22
von sparrow
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.