来自ids的Kivy回调自定义小部件调用引发了AttributeError

时间:2018-05-18 13:35:59

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

我正在尝试从其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()

调用脚本会导致我无法理解的运行时错误。 您是否知道如何通过应用程序管理此类事件回调?

1 个答案:

答案 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"