سؤال

لدي هذا الرمز لإنشاء واجهة وبعض الأزرار (python in 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]))

وأود تحويله إلى شيء مثل هذا لإنشاء الأزرار تلقائيًا ومعرفة أسمائها (حتى أتمكن من الاستعلام عنها لاحقًا)

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)

أواجه حقًا مشاكل في فهم كل هذا "الذات". سير العمل ، لذلك ربما أفتقد شيئًا أساسيًا ولكن كل ما جربته حتى الآن لم ينجح: S

شكرًا!

هل كانت مفيدة؟

المحلول

إنها مجرد مشكلة في بناء الجملة.السمات المحددة في بناء الجملة يجب أن تكون معرفات، إذا كنت تريد السمات التي تم إنشاؤها فسوف تحتاج إلى استخدامها getattr أو setattr (أو delattr):

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

يستبدل value بالقيمة التي تريدها.هذا حقا لا علاقة له self: self هي مجرد وسيطة دالة أخرى وتتصرف مثل أي متغير آخر.

نصائح أخرى

ماذا عن setattr?

class Foo:
    def __init__(self):
        # Set attribute "bar" on this object to the number 1
        setattr(self, "bar", 1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top