我正在尝试从其ID中调用自定义窗口小部件方法。
但我收到了dataType: 'script'
。
尽管可以使用PanelApp.py文件找到一个简单的工作示例:
AttributeError: 'LabelBox' object has no attribute 'change_first_text'
和panel.kv文件:
from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_file("panel.kv")
class LabelBox(BoxLayout):
def __init__(self, *args, **kwargs):
super(LabelBox, self).__init__(*args, **kwargs)
def change_first_text(self, text):
self.ids.first.text = text
class ButtonList(BoxLayout):
pass
class Test(TabbedPanel):
pass
class TabbedPanelApp(App):
def build(self):
self.test = Test()
self.btn_list = ButtonList()
self.vbox = BoxLayout(orientation="vertical")
self.vbox.add_widget(self.btn_list)
self.vbox.add_widget(self.test)
return self.vbox
def change_first(self, value):
print("Button clicked and new value is: '{}'".format(value))
self.test.ids.lbs.change_first_text(value)
if __name__ == '__main__':
TabbedPanelApp().run()
调用脚本会导致我无法理解的运行时错误。 您是否知道如何通过应用程序管理此类事件回调?
答案 0 :(得分:2)
您的案例中的问题是您正在创建名为LabelBox
的两个类:
1
class LabelBox(BoxLayout):
def __init__(self, *args, **kwargs):
super(LabelBox, self).__init__(*args, **kwargs)
def change_first_text(self, text):
self.ids.first.text = text
2
<LabelBox@BoxLayout>:
Label:
id: first
text: "first"
Label:
id: two
text: "two"
我知道你只想拥有一个类,所以使用.py中的继承进行创建是合适的,只有.kv
中的子进程的实现。解决方案是更改@BoxLayout
.kv
<LabelBox>:
Label:
id: first
text: "first"
Label:
id: two
text: "two"