Pregunta

Tengo este código para crear una interfaz y algunos botones (python en 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]))

y me gustaría cambiarlo a algo como esto para crear los botones automáticamente y conocer sus nombres (para poder consultarlos más adelante)

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)

Realmente estoy teniendo problemas para entender todo este "yo".flujo de trabajo, probablemente me esté perdiendo algo básico, pero todo lo que he intentado hasta ahora no ha funcionado: S

¡gracias!

¿Fue útil?

Solución

Es solo un problema de sintaxis.Los atributos especificados en la sintaxis deben ser identificadores; si desea atributos generados, deberá utilizar getattr o setattr (o delattr):

for attr, nice in zip(attrs, niceAttrs):
    setattr(self, attr, value)

Reemplace value con el valor que desee.Esto realmente no tiene nada que ver con self: self es solo otro argumento de función y se comporta como cualquier otra variable.

Otros consejos

¿Qué tal setattr ?

class Foo:
    def __init__(self):
        # Set attribute "bar" on this object to the number 1
        setattr(self, "bar", 1)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top