Kindfenster: Schreibweise

Fragen zu Tkinter.
Antworten
T.T. Kreischwurst
User
Beiträge: 52
Registriert: Dienstag 2. Februar 2016, 10:56

Hallo Forum,

was ist denn der Unterschied zwischen folgenden beiden Schreibweisen zur Implementierung eines neuen (Popup)Fensters in Tkinter:

Code: Alles auswählen

class MainGUI:
	def __init__(self, tk):
		self._tk = tk
		usw.
		...
	def popup_fenster(self):
		self.fenster = Toplevel()
und

Code: Alles auswählen

class MainGUI:
	def __init__(self, tk):
		self._tk = tk
		usw.
		...
	def popup_fenster(self):
		fenster = Toplevel(self._tk)
In der Praxis wollte ich später, aus einer anderen Funktion heraus, auf ein Widget des Kindfensters zugreifen: main_window.fenster.ein_eingabefeld (wobei main_window der Name des MainGUI Objekts ist).
In ersterer Schreibweise klappt das, in zweiterer Schreibweise nicht: da wird ein Attribute Error geworfen. Ich dachte immer, es sei ausreichend, eine Master-Slave Hierarchie für solche Zugriffe zu definieren, aber offensichtlich ist dem nicht so. :K
BlackJack

@T.T. Kreischwurst: Der Unterschied ist das Du im ersten Beispiel auf `MainGUI` ein Attribut setzt und im zweiten nicht. Woher sollte das denn auf magische Weise kommen? Und wie undurchsichtig wäre das wenn beliebige *lokale* Namen durch ”Magie” zu Attributen werden können — oder eben auch nicht. Wenn das so ginge und man das Attribut nicht haben möchte, was müsste man denn dann machen?

Das `fenster`-Attribut sollte übrigens nicht erst in der `popup_fenster()`-Methode das erste mal angelegt werden, sondern schon in der `__init__()`. Nach dem die abgelaufen ist, sollte ein Objekt alle Attribute besitzen. Und wenn es erst einmal nur auf `None` gesetzt wird, daran kann man dann immerhin schon sehen, dass es so ein Attribut gibt, und das noch kein Kindfenster existiert.
Antworten