我不能为我的生活找出如何通过KV文件在自定义小部件上传递自定义属性。我的应用程序是一个包含Button()和TestWidget()的简单网格。 TestWidget()有一个StringProperty()test_property,似乎没有从init上的print语句看到的KV文件中获取数据。这里有一些快速直接的代码作为例子。
感谢。
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.properties import StringProperty
Builder.load_string("""
<TestWidget>:
<TestGrid>:
Button:
TestWidget:
test_property: 'Test Property'
""")
class TestWidget(Widget):
test_property = StringProperty()
def __init__(self, **kwargs):
super(TestWidget, self).__init__(**kwargs)
print('Test OUTPUT:', self.test_property)
class TestGrid(GridLayout):
pass
class MyApp(App):
def build(self):
return TestGrid()
MyApp().run()
答案 0 :(得分:1)
我想我明白了。 Kivy没有向对象传递任何东西。我在https://kivy.org/docs/api-kivy.properties.html学到了这一点。
我使用on_做需要做的事情。 Kivy Objects和Python Objects之间存在很大差异。
以下是自定义BoxLayout的示例;
class KivyInput(BoxLayout):
text_test = StringProperty()
def __init__(self, **kwargs):
super(KivyInput, self).__init__(**kwargs)
self.orientation = 'horizontal'
self.label = Label()
self.text_input = TextInput(multiline=False)
self.add_widget(self.label)
self.add_widget(self.text_input)
def on_text_test(self, instance, value):
self.label.text = value
def remove(self):
self.clear_widgets()
答案 1 :(得分:0)
尝试在即将到来的帧上打印,而不是在对象的启动中打印 创建对象后,您可以访问属性 你用时钟做到了。 像这样:
from kivy.clock import Clock
class TestWidget(Widget):
test_property = StringProperty()
def __init__(self, **kwargs):
super(TestWidget, self).__init__(**kwargs)
Clock.schedule_once(self.after_init) # run method on next frame
def after_init(self,dt):
print('Test OUTPUT:', self.test_property)