Python / Kivy-变量运行时评估错误

时间:2019-01-19 11:20:33

标签: python runtime kivy evaluation

问题如下:

我有一个class DocModel(EventDispatcher):和一个doc属性,该属性返回一个包含所有非零属性的字典,我将其用作我的ModelViewModelForm类的模型

ModelView是要与Widget一起使用的mixin,以方便显示模型信息

ModelForm是要与Widget一起使用的mixin,它将其输入字段值绑定到其模型,以便字段中的任何更改都会更改模型属性

分配给ModelForm.model,将覆盖其字段的值 ModelForm.modelAliasProperty(_get_model, _set_model, bind=['_model']),并且始终返回DocModel代码的子类,如下所示:

#models.py
#DocModel is an EventDispatcher with a doc method that returns a dict
class User(DocModel):

    profile = ObjectProperty()


class Profile(DocModel):
    pass


class MetaModelView(object):

    def get_model_cls(self):
        model_cls = self._model_cls
        if isinstance(model_cls, type) and issubclass(model_cls, DocModel):
            return self._model_cls
        else:
            return getattr(sys.modules[__name__], self._model_cls)

    model_cls = AliasProperty(get_model_cls, None)

    _model = ObjectProperty(None, baseclass=DocModel, rebind=True)

    def _get_model(self):
        return self._model

    def _set_model(self, model):
        self.set_model(model)

    model = AliasProperty(_get_model, _set_model, bind=['_model'])


class ModelView(MetaModelView):
    #there is code here, but modelview is woring fine, no need to look into it
    pass


class ModelForm(MetaModelView):

    def set_model(self, model, *args):

        #print 'model form set_model({}, {})'.format(model, args)
        if model is None:
            self.clear_fields()  #sets all fields to default

        if not isinstance(model, self.model_cls):
            #print 'not model_cls'
            if isinstance(model, DocModel):
                #print 'is DocModel'
                model = self.model_cls(**model.doc)
            elif isinstance(model, dict):
                #print 'is dict'
                model = self.model_cls(**model)
            else:
                raise Exception('Invalid model type: {}'.format(type(model)))

        #print self, model
        if self._model is not None:
            #if this is not the first assignment
            #print '#overwrite fields'
            self.set_fields(model.doc)
        else:
            self._model = model

    def set_fields(self, doc={}):
        ids = self.ids
        #print 'ids', ids
        print 'doc', doc

        for field in self.fields:
            print 'setting field {} to {}'.format(field, doc.get(field, None))
            ids[field].data = doc.get(field, None)


#views.py
class Root(ModelView, Relativelayout):

    _model_cls = 'User'


class MyForm(ModelForm, RelativeLayout):

    _model_cls = 'Profile'

所以在kv中,我可以做这样的事情:

KV = '''
<Root>: #ModelView
    MyForm: #ModelForm
        model: root.model.profile
'''

因此,只要Root.model.profile发生变化,MyForm._set_model(new_model)就会运行,这就是问题发生的地方

在上述代码段的第62行的MyForm.set_model()内,我叫self.set_fields(model.doc) 此方法所做的全部工作就是用model.doc属性(一个字典)中的数据填充字段,并且这样做是有价值的 但仅当我运行摘要的第43行或58行时

如果运行时注释了这些行,则当代码到达self.set_fields(model.doc)时,model.doc是空字典,我知道那是不对的。

所以我添加了这些行以检查是否将空模型传递到set_model,而且正如我所期望的那样,不是。 瞧,字段设置正确了。。我很困惑,试图注释掉该行,问题又重演了

我可以在它们之间放置多个打印件,但是仅打印出模型本身并不会产生任何效果

我可以就可能发生的情况以及如何解决此问题获得一些意见吗?

0 个答案:

没有答案