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

dynamische funktions/variablen-namen

Beitragvon Zatic » Samstag 30. August 2003, 16:51

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

Beitragvon Milan » Samstag 30. August 2003, 17:06

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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Samstag 30. August 2003, 17:43

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

Beitragvon Gast » Samstag 30. August 2003, 17:56

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?
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Samstag 30. August 2003, 19:48

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

Beitragvon Zatic » Montag 1. September 2003, 14:18

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..
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 1. September 2003, 17:58

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
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 2. September 2003, 16:15

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder