Получение идентификаторов виджетов / предметов в TabbedPanel - PullRequest
0 голосов
/ 08 апреля 2019

Я создал простое приложение в Kivy, в котором есть вкладки, и в каждой вкладке у меня есть только несколько виджетов.До добавления tabbedPanel у меня не было проблем с достижением каждого виджета через "идентификаторы".Например:

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

Однако теперь, когда я добавил виджеты в панель с вкладками, они стали недоступны для меня.Панель tabbedPanel «блокирует» меня и не содержит идентификаторов: например, мой .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 и обнаружил, что у него есть только один «children», который является «.content».Но все же я не могу получить доступ к виджетам на этой вкладке.

Я поступаю неправильно?Или кто-нибудь может подсказать мне, как получить доступ к виджетам на определенной вкладке.

1 Ответ

0 голосов
/ 08 апреля 2019

С Kivy TabbedPanel вы можете ссылаться на ids, используя app.root.ids.id-name или self.ids.id-name, например, app.root.ids.label3.text или self.ids.label3.text, потому что, когда ваш файл kv анализируется, kivy собирает все виджеты, отмеченные id's и помещает их в это 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

...