如何从KV语言将数据传递到自定义窗口小部件

时间:2019-06-29 05:56:58

标签: python-3.x kivy kivy-language

我想将变量传递给自定义窗口小部件的类以构造它。

Python:

class Customwidget(BoxLayout)
        mystring = StringProperty()
        def __init__(self, **kwargs):
            super(Customwidget, self).__init__(**kwargs)
            print(mystring)

基维

Root:
    BoxLayout:
        orientation: 'vertical'
        Customwidget:
            mystring: 'stringcontents'

执行此命令时,mystring保持为空。如何将其传递给类,以便可以在 init 中使用它来定义小部件内容的逻辑?

1 个答案:

答案 0 :(得分:0)

问题-空字符串

  

执行此命令时,mystring保持为空。我如何将其传递给   类,这样它就可以在init中用于定义   小部件的内容?

根本原因

  

load_kv()中调用run()函数,因此,   在此kv文件中定义并创建其样式的任何窗口小部件   在run()被调用之前(例如在__init__中),将不会具有其样式   应用。请注意,build()load_kv被调用之后被调用   叫。

解决方案

在Kivy完成样式之后,使用Kivy Clock schedule_once()方法来调用print()函数。

摘要

def __init__(self, **kwargs):
    super(Customwidget, self).__init__(**kwargs)
    Clock.schedule_once(lambda dt: print(f"mystring={self.mystring}"), 0.02)

示例

main.py

from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.clock import Clock


class Customwidget(BoxLayout):
    mystring = StringProperty()

    def __init__(self, **kwargs):
        super(Customwidget, self).__init__(**kwargs)
        Clock.schedule_once(lambda dt: print(f"mystring={self.mystring}"), 0.02)


runTouchApp(Builder.load_string("""
Screen:
    BoxLayout:
        orientation: 'vertical'
        Customwidget:
            mystring: 'stringcontents'
"""))