在kivy python中从类属性中获取值

在kivy python中从类属性中获取值,python,python-3.x,binding,kivy,Python,Python 3.x,Binding,Kivy,由于x是类foo的对象,我有多个类愉快地交流: class foo(EventDispatcher): def variable_input(self, *args): self.a='This is an observed value being changed' def __init__(self): self.a=StringProperty('') 现在我创建了一个对象X,作为类foo的一个实例 X=foo() 我有一个屏幕作为屏幕管理器的一部分

由于
x
是类foo的对象,我有多个类愉快地交流:

class foo(EventDispatcher):
   def variable_input(self, *args):
      self.a='This is an observed value being changed'

   def __init__(self):
      self.a=StringProperty('')
现在我创建了一个对象
X
,作为类foo的一个实例

X=foo()
我有一个
屏幕
作为
屏幕管理器
的一部分,其中包含一个id为
vystup的
标签

class Hlavne(Screen):
   pass
我想做的是用
X.a
作为propname在_propname
上编写函数
。
如何指向属于其他类实例的值

我读过:

警告

小心“开着”。如果要在继承的属性上创建这样的回调函数,那么也不要忘记调用超类函数


但与kivy的文档一样,它并没有告诉您如何声明。

kivy属性是在级别声明的,而不是在实例中声明的。(坏)

绑定到属性和对_属性
事件使用
是两件不同的事情

from kivy.clock import Clock
from kivy.base import runTouchApp
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty


class Test(Widget):
    hop = NumericProperty(0)

    def __init__(self, **kwargs):
        super(Test, self).__init__(**kwargs)
        Clock.schedule_interval(
            lambda *dt: setattr(self, 'hop', self.hop + 1), 0.1
        )

        # bind to property
        self.bind(hop=self.bind_hop)

    def on_hop(self, instance, value):
        # no event, no super() necessary
        # unless inherrited from "Test"
        print('on_hop:', instance, value)

    def bind_hop(self, instance, value):
        print('bind_hop:', instance, value)

runTouchApp(Test())

您可以使用检查每个函数中的一个实例,因为
instance
参数传递到提到的Kivy属性的每个事件/绑定中

我将在明天检查,我承认,作为一个新的python用户,我确实发现很难理解super的语法。塔克斯now@Tomas粗略地说,想象一个类
a
,其方法是
a.x
。现在,使用相同的命名方法
B.x
创建另一个类
B
。由于
B
继承自
A
,因此它可以(大部分)从类
A
访问所有内容,因此即使是
x
方法,但是通过创建
B.x
可以覆盖继承的
A.x
方法的内容。要停止覆盖,即执行
A.x
中的代码,您可以调用
super(当前类名,当前实例).method(args)
,在这种特殊情况下,它将是
super(B,self).x()。这样,您可以在新的
B.x
代码之前或之后执行
A.x
from kivy.clock import Clock
from kivy.base import runTouchApp
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty


class Test(Widget):
    hop = NumericProperty(0)

    def __init__(self, **kwargs):
        super(Test, self).__init__(**kwargs)
        Clock.schedule_interval(
            lambda *dt: setattr(self, 'hop', self.hop + 1), 0.1
        )

        # bind to property
        self.bind(hop=self.bind_hop)

    def on_hop(self, instance, value):
        # no event, no super() necessary
        # unless inherrited from "Test"
        print('on_hop:', instance, value)

    def bind_hop(self, instance, value):
        print('bind_hop:', instance, value)

runTouchApp(Test())