dynamische funktions/variablen-namen

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
Zatic
User
Beiträge: 3
Registriert: Samstag 30. August 2003, 16:44

Hallo!

Folgendes Problem:

Ich erstelle in einer Schleife eine Menge von Eigenschaften|Methoden einer Klasse. Diese sollen ihre namen in abhängigkeit des schleifendurchlaufs erhalten, zB:

for i in range(1,4):
[...] gesuchter Vorgang hier [...]

sollte dann folgendes ergeben:

self.var1
self.var2
self.var3

Kann mir jemand sagen, wie ich im obigen beispiel die variablen var(i) in abhängigkeit der variable i benenne?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Also prinzipiell geht das mit eval und / oder exec, aber dynamische Variablennamen sind eigentlich schlechter Stil... Ich weiß nicht in welcher Abhängigkeit du das brauchst, aber wäre es nicht leichter Listen oder Dictionarys zu nehmen ?

Ps.: benutze bitte das nächste mal für Beispielcode die [code]...[/code] Tags, da bleibt die Formatierung erhalten.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Zatic,

wie Milan schon sagte, für solche zwecke bieten sich Listen oder Dictionaries an. Hier ein Beispiel mit einem Dictionary:

Code: Alles auswählen

>>> var = {}    
>>> for i in xrange(1,4):
...     var[i] = i*2
... 
>>> print var
{1: 2, 2: 4, 3: 6}
>>> print var[1]
2
>>> print var[2]
4

Gruß

Dookie
Gast

okay, also die ausfürhliche version:

Ich bin dabei ein kleines Spiel zu programmieren (vielleicht kennt jemand das kartenspiel SET?).

Hier der bisherige quelltext: http://www.rafb.net/paste/results/eu491851.html

In Zeile 175 wird ein Button erstellt, und auf diesen ein Bild gelegt. Das ganze in einer schleife mit 12 durchläufen, so dass 12 bilder erscheinen.
Klickt man nun 3 bilder in einer betimmten reihenfolge an, sollen diese 3 entfernt und durch 3 neue ersetzt werden.

die karten sind alle in einer liste gespeichert, die in zeile 146 erstellt wird.

Die methode gotSet() soll in Zeile 95-105 dann eben diese neuen buttons einfügen. Aber genau das funktioniert nicht, die alten bleiben unverändert an ort und stelle.

Ich mach halt zum ersten mal was mit PyGTK und hab davon nicht so die ahnung?

irgendwelche vorschläge, ideen?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

eventuell hilft ein self.table.realize() nach Zeile 114, ich konnte es leider nicht testen, weil ich die Bildchen für die Buttons/Karten nicht habe.

Dookie
Zatic
User
Beiträge: 3
Registriert: Samstag 30. August 2003, 16:44

hmm, nein, das geht leider nicht...

Ich hab auch daran gedacht, erst einmal die alten buttons zu unrealizen, und dann die neuen einzusetzen. Deshalb wollte ich ja den buttons die dynamischen namen geben..

www.zatic.net/set/set.tar.gz enthält auch einen großteil der bilder..
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

wie oben schon gezeigt, pack die Buttons in ein Dictionary (self.buttons), über das Du dann die Buttons ansprechen kannst und die Labelgrafiken austauschen.

Dookie
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Falls Du mit dem Dictionary ned klar kommst, könntest Du auch mit setattr arbeiten.
Alsz z.B.

Code: Alles auswählen

setattr(self, "button"+str(x), gtk.Button(...))
Mit getattr() kannst Du dann auf die Buttons auch zugreifen.
Beispiel:

Code: Alles auswählen

image = getattr(self,"button"+str(x)).children()[0]
Gruß

Dookie
Antworten