在TabbedPanel中获取小部件/商品ID

时间:2019-04-08 09:03:30

标签: python kivy kivy-language

我在Kivy中创建了一个简单的应用程序,该应用程序具有选项卡,每个选项卡中我只有几个小部件。在添加tabbedPanel之前,我没有问题可以通过“ ids”到达每个小部件。例如:

app.root.ids.mylabel1.ids.mylabel2.content

但是,现在我已经在tabbedPanel中添加了小部件,这些小部件对我来说变得无法访问。 tabbedPanel“阻止”我并且不包含ID:例如,我的.kv文件具有一个按钮:

<SelectableButton>:
    text: self.button_text
    id: SelectableButton_id
    canvas.before:
        Color:
            rgba: (0, 0.517, 0.705, 1) if self.selected else (0, 0.517, 0.705, 1)
        Rectangle:
            pos: self.pos
            size: self.size
    state: self.btnState
    on_release:
        print(app.root.content.ids)

返回一个空字典。我按照tabbedPanel的指导进行操作,发现它只有一个“子项”,即“ .content”。但我仍然无法在此选项卡中找到任何小部件。

我会以错误的方式处理吗?或者有人可以指导我如何访问特定选项卡中的窗口小部件。

1 个答案:

答案 0 :(得分:0)

使用Kivy TabbedPanel,您可以使用idsapp.root.ids.id-name来引用self.ids.id-name,例如app.root.ids.label3.textself.ids.label3.text的原因,是因为在解析您的kv文件时,kivy会收集所有标有 id 的小部件,并将它们放在此self.ids字典类型属性中。

示例

main.py

from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.button import Button

Builder.load_string("""

<Test>:
    size_hint: .5, .5
    pos_hint: {'center_x': .5, 'center_y': .5}
    do_default_tab: False

    TabbedPanelItem:
        text: 'first tab'
        Label:
            text: 'First tab content area'

    TabbedPanelItem:
        id: tab2
        text: 'tab2'

        BoxLayout:
            id: box1
            orientation: 'vertical'

            Label:
                id: label1
                text: 'Second tab content area'
            Button:
                id: button1
                text: 'Button that does nothing'

            BoxLayout:
                id: box2
                orientation: 'vertical'

                Label:
                    id: label2
                    text: 'Label 2'

                BoxLayout:
                    id: box3
                    orientation: 'vertical'

                    Button:
                        id: button2
                        text: 'Button 2'
                    Label:
                        id: label3
                        text: 'Label 3'

    TabbedPanelItem:
        text: 'tab3'
        RstDocument:
            text:
                '\\n'.join(("Hello world", "-----------",
                "You are in the third tab."))

""")


class Test(TabbedPanel):

    def __init__(self, **kwargs):
        super(Test, self).__init__(**kwargs)
        print(f"\nself.ids.items():")
        for key, val in self.ids.items():
            if isinstance(val, Label) or isinstance(val, Button):
                print(f"\tkey={key}, val={val}, val.text={val.text}")
            else:
                print(f"\n\tkey={key}, val={val}")

        print(f"\nself.ids.label3.text={self.ids.label3.text}")


class TabbedPanelApp(App):
    def build(self):
        return Test()


if __name__ == '__main__':
    TabbedPanelApp().run()

输出

Result