Python Dynamische Variablennamen

dieterz1

Ensign
Registriert
Jan. 2014
Beiträge
245
Hallo,
was in PHP sehr einfach umzusetzen ist, scheint in Python ein komplexes Thema zu sein: Dynamische Variablennamen

Ich möchte diesen Code
Code:
meinButton1 = wx.Button(self.panel, -1, "Inhalt1", pos=(0, 0), size=(50, 20))
meinButton1.Bind(wx.EVT_BUTTON, lambda event: self.start('blabla'))
mittels Schleife mehrfach ausgeben (sprich: es sollen mehrere Buttons erzeugt werden.
Damit "Bind" die Zuordnung zum richtigen Button findet, benötige ich jedes Mal einen neuen Variablennamen.

Bei 3 Durchläufen muss das Ergebis so aussehen:

Code:
meinButton1 = wx.Button(self.panel, -1, "Inhalt1", pos=(0, 0), size=(50, 20))
meinButton1.Bind(wx.EVT_BUTTON, lambda event: self.start('blabla'))
meinButton2 = wx.Button(self.panel, -1, "Inhalt2", pos=(0, 0), size=(50, 20))
meinButton2.Bind(wx.EVT_BUTTON, lambda event: self.start('blabla'))
meinButton3 = wx.Button(self.panel, -1, "Inhalt3", pos=(0, 0), size=(50, 20))
meinButton3.Bind(wx.EVT_BUTTON, lambda event: self.start('blabla'))

Wie kann ich die Variable meinButtonx dynamisch generieren?

Als möglichen Ansatz (?) habe ich "setattr" und "getattr" gefunden:

https://www.programiz.com/python-programming/methods/built-in/setattr
https://www.programiz.com/python-programming/methods/built-in/getattr

Damit kann ich tatsächlich einen dynamischen Variablennamen erzeugen, und diesen Namen auch einen Wert zuweisen, aber in meinem Fall soll kein einzelner Wert (z.B. eine Zahl oder ein String) zugewiesen werden, sondern ein kompletter "Button-Code" inklusive die Bind-Funktion. Also so:

Code:
meinButton1 = wx.Button(self.panel, -1, "Inhalt1", pos=(0, 0), size=(50, 20))
meinButton1.Bind(wx.EVT_BUTTON, lambda event: self.start('blabla'))

Wer kann helfen?
 
Variable erzeugen mit setattr erzeugen und dann binden?
 
Ob die Variablennamen überhaupt dynamisch vergeben werden können weiß ich nicht.

Aber ich hätte in diesem Fall zu einer Liste/Array gegriffen, die man ja in Python dynamisch erweitern kann. Heißt dann halt nur meinButton[1] statt meinButton1
 
  • Gefällt mir
Reaktionen: BeBur, M4ttX und Shio
Ich kenn mich mit Python nicht aus und weiß nicht ob es möglich ist, dynamisch Variablennamen zu vergeben.
Aber das Konzept von Arrays gibt es doch sicher? Also:

Code:
for(i = 0;i <= 3; i++) {
    button[i].bind;
}

Edit: zu langsam
 
  • Gefällt mir
Reaktionen: BeBur
Gibt verschiedene Möglichkeiten (google: python string to variable name), aber wie schon gesagt wird das mithilfe von arrays gemacht.
 
Manchmal sieht man vor lauter Bäumen den Wald nicht, danke!
Jetzt ergibt sich aber ein neues Problem:

Code:
meinButton = {}
y_achse = 30
counter = 0

for meineVariable in meinArray:
    meinButton[counter] = wx.Button(self.panel, -1, meineVariable, pos=(0, y_achse), size=(50, 20))
    meinButton[counter].Bind(wx.EVT_LEFT_DOWN, lambda event: print(meineVariable))
    counter += 1
    y_achse += 30

"meinArray" hat z.B. 5 Inhalte, die Schleife wird also 5mal durchlaufen und somit werden 5 Buttons generiert.
Egal welchen Button ich drücke - es wird immer nur der Inhalt (meineVariable) des letzten Schleifendurchlaufs ausgegeben.

Warum?
 
meineVariable Ist eine Referenz auf den aktuellen Wert in der Schleife. Diese Referenz übergibst du an Bind. Nach der Schleife zeigt die Referenz entsprechend auf das letzte Element der Schleife.

Siehe auch hier.
Mehr kontext hier oder hier.
 
  • Gefällt mir
Reaktionen: abcddcba
BeBur schrieb:
meineVariable Ist eine Referenz auf den aktuellen Wert in der Schleife. Diese Referenz übergibst du an Bind. Nach der Schleife zeigt die Referenz entsprechend auf das letzte Element der Schleife.

Siehe auch hier.
Mehr kontext hier oder hier.
Zunächst einmal Danke für die Hilfestellung!
Ich bin mir jetzt trotzdem nicht sicher, ob ich alles richtig verstanden habe.
Mit "meinButton[counter]" erzeuge ich zwar verschiedene (dynamische) Variablennamen, jedoch ist es letztendlich doch nur ein- und dieselbe Variable, weshalb sie bei jedem Schleifendurchlauf überschrieben wird. Am Ende bleibt also der letzte Wert übrig.
Keine Ahnung, wie ich das Problem umgehen kann.
Mit den verlinkten Seiten bin ich nicht wirklich auf den Lösungsweg gekommen.
 
dieterz1 schrieb:
Ich bin mir jetzt trotzdem nicht sicher, ob ich alles richtig verstanden habe.
War auch nicht gut erklärt und die Links waren auch nicht so mega gut.
Hier wird es gut erklärt und auch eine Lösung angegeben: Link
 
BeBur schrieb:
War auch nicht gut erklärt und die Links waren auch nicht so mega gut.
Hier wird es gut erklärt und auch eine Lösung angegeben: Link
Du warst mir eine große Hilfe, vielen Dank BeBur!
 
Zurück
Oben