la création d'un nom variable dynamiquement
Question
J'ai ce code pour créer une interface et quelques boutons (python MAYA)
class mrShadowMapChangerUI:
def __init__(self):
smAttrs = ['shadowMap','smapResolution','smapSamples','smapSoftness','smapBias']
smNiceAttrs = ['Active','Resolution','Samples','Softness','Bias']
attrs = zip(smAttrs,smNiceAttrs)
self.form = mc.columnLayout()
self.smapResolutionField = mc.textFieldButtonGrp( label=attrs[1][1], text=int(defaultLightValues[1]), bc=Callback(self.setSmValue, attrs[1][0]))
self.smapSamplesField = mc.textFieldButtonGrp( label=attrs[2][1], text=int(defaultLightValues[2]), bc=Callback(self.setSmValue, attrs[2][0]))
self.smapSoftnessField = mc.textFieldButtonGrp( label=attrs[3][1], text=('%.3f' % defaultLightValues[3]), bc=Callback(self.setSmValue, attrs[3][0]))
self.smapBiasField = mc.textFieldButtonGrp( label=attrs[4][1], text=('%.3f' % defaultLightValues[4]), bc=Callback(self.setSmValue, attrs[4][0]))
et je voudrais passer à quelque chose comme ceci pour créer automatiquement les boutons et connaître leurs noms (pour que je puisse les interroger plus tard)
class mrShadowMapChangerUI:
def __init__(self):
smAttrs = ['shadowMap','smapResolution','smapSamples','smapSoftness','smapBias']
smNiceAttrs = ['Active','Resolution','Samples','Softness','Bias']
attrs = zip(smAttrs,smNiceAttrs)
self.form = mc.columnLayout()
for attr in attrs:
self.('%s' % attr[0]) = mc.textFieldButtonGrp( label=attr[1], text=int(defaultLightValues[1]), bc=Callback(self.setSmValue, attr[0]))
mc.showWindow(self.window)
Je suis vraiment avoir des problèmes à comprendre tout cela « soi ». flux de travail, donc sans doute que je suis absent, mais tout ce que quelque chose de fondamental, je l'ai essayé jusqu'à présent, n'a pas travaillé: S
merci!
La solution
Il est juste un problème de syntaxe. Les attributs spécifiés dans la syntaxe doivent être des identificateurs, si vous voulez attributs généré aurez besoin d'utiliser getattr
ou setattr
(ou delattr
):
for attr, nice in zip(attrs, niceAttrs):
setattr(self, attr, value)
Remplacer value
avec la valeur que vous voulez. Cela n'a vraiment rien à voir avec self
. self
est un autre argument de la fonction et se comporte comme toute autre variable
Autres conseils
Que diriez-vous setattr
class Foo:
def __init__(self):
# Set attribute "bar" on this object to the number 1
setattr(self, "bar", 1)