python - Kivy的几个属性的继承

标签 python kivy

假设我有 2 个 kivy 属性

  • 第一个属性负责确保值位于特定范围内(例如,从 0 到 1) - 我为此使用 BoundedNumericProperty
class MyBoundedProperty(BoundedNumericProperty):
    def __init__(self, *largs, **kw):
        self._my_min = kw.get('min', 0)  # 0 is default
        self._my_max = kw.get('max', 1.)  # 1 is default
        kw['min'] = self._my_min
        kw['max'] = self._my_max
        kw['errorhandler'] = self._my_errorhandler
        super().__init__(*largs, **kw)

    def _my_errorhandler(self, x):
        return min(max(x, self._my_min), self._my_max)
  • 第二个属性负责确保值始终四舍五入到五阶 (AliasProperty)
class MyAliasProperty(AliasProperty):
    _data = 0

    def __init__(self, **kwargs):
        kwargs['getter'] = self._getter
        kwargs['setter'] = self._setter
        super().__init__(**kwargs)

    def _getter(self, obj):
        return self._data

    def _setter(self, obj, value):
        if type(value) is int:
            value = float(value)
        if type(value) is float:
            self._data = round(value, 5)
        else:
            raise ValueError('{}.{} has an invalid format (got {!r})'.format(
                obj.__class__.__name__, self.name, value))
        return True  # Value changed, dispatch event

我希望在创建新属性时能够重用这些属性,因为我是通过小部件行为来实现的。 例如: x = MyProperty (MyBoundedProperty, MyAliasProperty)

这意味着 x 的值应该是 1) 在规定的限度内(最小值和最大值)并且 2) 四舍五入到第 5 阶 同时。

我想澄清一下 - 我的任务不是使用不同的属性(例如,可能是多个 Alias 属性)。我的任务是能够重用之前创建的属性来制作复合属性。

有办法做到这一点吗?

PS 让我澄清一下。 例如:

class MyRoundProperty(AliasProperty):
    _data = 0.

    def __init__(self, **kwargs):
        kwargs['getter'] = self._getter
        kwargs['setter'] = self._setter
        super().__init__(**kwargs)

    def _getter(self, obj):
        return self._data

    def _setter(self, obj, value):
        if type(value) is int:
            value = float(value)
        if type(value) is float:
            pass
            self._data = round(value, 5)
        else:
            raise ValueError('{}.{} has an invalid format (got {!r})'.format(
                obj.__class__.__name__, self.name, value))
        return True  # Value changed, dispatch event
class MyBoundProperty(AliasProperty):
    _data = 0.
    _min = 0.
    _max = 1.

    def __init__(self, **kwargs):
        self._min = kwargs.pop('min', 0.)  # 0 is default
        self._max = kwargs.pop('max', 1.)  # 1 is default
        kwargs['getter'] = self._getter
        kwargs['setter'] = self._setter
        super().__init__(**kwargs)

    def _getter(self, obj):
        return self._data

    def _setter(self, obj, value):
        if type(value) is int or float:
            value = min(max(value, self._min), self._max)
            self._data = value
        else:
            raise ValueError('{}.{} has an invalid format (got {!r})'.format(
                obj.__class__.__name__, self.name, value))
        return True  # Value changed, dispatch event

这有效:

class MyProperty(MyRoundProperty):
    pass

这有效:

class MyProperty(MyBoundProperty):
    pass

但是这个

class MyProperty(MyRoundProperty, MyBoundProperty):
    pass

仅表现得像 MyRoundProperty,并且我希望 MyProperty 具有这两个类的行为

最佳答案

这看起来像是一个“不,但是是”的情况。不,您可能无法毫无问题地继承多个属性,它们在管理其内部状态时会发生冲突。但是,是的,您可能可以通过合理的方式实现您真正想要的。

您可以通过多种方式来做到这一点,我不太清楚您在做什么以及因此什么是最好的选择。在最简单的情况下,您只需将舍入功能添加到 MyBoundedNumericProperty 中即可。 ,我不清楚您是否真的想要在单独的属性中使用该功能。一个更灵活的选择是制作一个类似于小部件行为的 mixin,可能会覆盖 __set__属性的方法。

关于python - Kivy的几个属性的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585432/

相关文章:

python - 找不到文件 <Python.h>

user-interface - Kivy 应用程序在 Mac 上看起来不一样

python - 将 TextInput 绑定(bind)到 .kv 文件中的标签

python - 在3.8.2上安装kivy python

python - Kivy - InputText 的限制值

Python数据帧索引-无法重新索引?

python - 使用 Python 创建数字每次都变大的列表

python - Altair(Python)中的世界地图+ slider

python - Mac OS High Sierra : Tensorflow verions returned by `pip3 upgrade ` and `python3 -c ' import tensorflow as tf; print(tf. __version__ )'` 不同

python - Kivy 弹出动态高度