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!

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top