如何在特定点读取代码中的 Kivy.properties.NumericProperty 值

How to read a Kivy.properties.NumericProperty value in my code at a specific point

所以基本上我有一个 kivy 项目,其中有一个我在许多 类 中使用的布局,因此..我已经自定义并将它放在一个单独的文件中,所以我可以从我的代码的不同部分引用它。

片段:

from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

Builder.load_string('''
<CustLayout>:
    #code here

''')

class CustLayout(BoxLayout):
    t_length = NumericProperty(0)
    my_len = 0
    print(my_len)

    def __init__(self, **kwargs):
        super(Silvertable,self).__init__(**kwargs)
        self.bind(t_length=self.on_t_length)
        #This statement is executed after all other prints
        print(self.t_length)

    def on_t_length(self,instance,length):
        #I'd like to get kv file value before the next line
        self.my_len = length
    print(my_len)

我的kiv文件:

#:import Silvertable silvertables.Silvertable

#chunk of code
BoxLayout:
    Silvertable:
        t_length: 5

在这里,我确实得到了值,但不幸的是太晚了。也就是说,我在程序完成后才得到值。my_len不改变它的还是0

绑定 Kivy 属性

my_len 的值为 0(零),因为 print() 函数先于 run() 方法执行。

根据 t_length 的 属性 上的绑定,my_len 的值确实从 0 更改为 5。

详情请参考示例和trace

例子

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty
from kivy.lang import Builder

Builder.load_string('''
<CustLayout>:
    t_length: 5
''')


class CustLayout(BoxLayout):
    t_length = NumericProperty(0)
    my_len = 0
    print("\tCustLayout.class level-start: my_len=", my_len)

    def __init__(self, **kwargs):
        super(CustLayout,self).__init__(**kwargs)
        print("\nCustLayout.__init__:")
        self.bind(t_length=self.on_t_length)
        #This statement is executed after all other prints
        print("\tself.t_length=", self.t_length)
        print("\tself.my_len=", self.my_len)

    def on_t_length(self, instance, length):
        print("\nCustLayout.on_t_length:")
        #I'd like to get kv file value before the next line
        self.my_len = length
        print("\tself.my_len=", self.my_len)

    print("\tCustLayout.class level-end: my_len=", my_len)


class TestBindProperty(App):

    def build(self):
        print("\nTestBindProperty.build:")
        return CustLayout()

    def on_stop(self):
        print("\tTestBindProperty.on_stop: my_len=", self.root.my_len)


if __name__ == "__main__":
    TestBindProperty().run()

输出