Kivy, как создать выпадающий список в GridLayout - PullRequest
0 голосов
/ 20 марта 2019

У меня есть 2 файла: один из py , а другой kv , и, как следует из названия, я не знаю, как добавить раскрывающийся список.

---> main.py

from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.gridlayout import GridLayout

class MyGridLayout(GridLayout):
    pass

class LayoutsApp(App):
    def build(self):
        return MyGridLayout()


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

---> layouts.kv

<MyGridLayout>:
    rows: 2
    id: main_win
    Dropdown:
        id: dropdown
        Button:
            id: btn1
            text: 'option 1'
        Button:
            id: btn2
            text: 'option 2'
    BoxLayout:

    BoxLayout:

при компиляции выдает ошибку для этой части.Как правильно сделать вызов для выпадающего списка?

1 Ответ

0 голосов
/ 20 марта 2019

Вопрос 3

вызвать идентификатор кнопки: btn2, как бы я это сделал?- Я имею в виду: класс MyGridLayout (GridLayout):

Решение 3

Python-скрипт

  • Добавить операторы импорта: from kivy.uix.dropdown import DropDown;from kivy.properties import ObjectProperty
  • Реализация class CustomDropDown(DropDown):
  • В классе MyGridLayout объявите ObjectProperty на уровне класса (например, dropdown = ObjectProperty(None); реализуйте метод dropdown_open(self):; создайте экземпляр класса CustomDropDown и назначьте его дляself.dropdown и т. Д. Подробные сведения см. В фрагментах.

файл kv

  • Удаление self.dismiss ()
  • Замена динамического класса, <CustomDropdown@DropDown>: с правилом класса, <CustomDropDown>:
  • Заменить rows: 2 на rows: 3
  • Заменить Factory.CustomDropdown().open(self) на root.dropdown_open(self)

Пример 3

main.py - Фрагменты кода

from kivy.uix.dropdown import DropDown
from kivy.properties import ObjectProperty


class CustomDropDown(DropDown):
    pass


class MyGridLayout(GridLayout):
    dropdown = ObjectProperty(None)

    def dropdown_open(self, instance):
        self.dropdown = CustomDropDown()
        self.dropdown.open(instance)
        print(self.dropdown.ids.btn2.text)

layouts.kv - Фрагменты кода

<CustomDropDown>:
    id: dropdown
    on_select:
        app.root.ids.btn.text = '{}'.format(args[1])
...
<MyGridLayout>:
    rows: 3
    id: main_win

    Button:
        id: btn
        text: 'Press'
        size_hint_y: None
        height: '48dp'
        on_release:
            root.dropdown_open(self)

Выход 3

Printed btn2.text

Вопрос 2

, когда я добавил эти команды, он не работает: BoxLayout: ориентация: «вертикальный» size_hint: (.9, .9) BoxLayout: ориентация: «вертикальный»size_hint_y: 0.5

Примечание

Возможно, вам придется увеличить строки с 2 до 3.

Пример # 2

  • Добавлен конфиг для двух BoxLayout
  • Для иллюстрации добавлен цвет на холст для обоих BoxLayout

layouts.kv

#:kivy 1.10.1
#:import Factory kivy.factory.Factory

<CustomDropdown@DropDown>:
    id: dropdown
    on_select:
        app.root.ids.btn.text = '{}'.format(args[1])
        self.dismiss()

    Button:
        id: btn1
        text: 'option 1'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn1.text)

    Button:
        id: btn2
        text: 'option 2'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn2.text)

<MyGridLayout>:
    rows: 2
    id: main_win

    Button:
        id: btn
        text: 'Press'
        on_release: Factory.CustomDropdown().open(self)
        size_hint_y: None
        height: '48dp'

    BoxLayout:
        orientation: 'vertical'
        size_hint: (.9,.9)
        canvas.before:
            Color:
                rgba: 1, 0, 0, 1    # red
            Rectangle:
                pos: self.pos
                size: self.size

    BoxLayout:
        orientation: 'vertical'
        size_hint_y: 0.5
        canvas.before:
            Color:
                rgba: 0, 0, 1, 1    # blue
            Rectangle:
                pos: self.pos
                size: self.size

Вывод # 2

App Startup DropDown List DropDown Selected

Solution # 1

DropDown виджет похож на Popup виджет, то есть они являются специальнымиwidget.

Popup / DropDown - это специальный виджет.Не пытайтесь добавить его как ребенка в любой другой виджет.Если вы это сделаете, Popup / DropDown будет обрабатываться как обычный виджет и не будет скрыт в фоновом режиме.

Поэтому создайте динамический класс с наследованием виджета DropDown и используйте Factory длясоздать экземпляр класса.

Пример

main.py

from kivy.app import App
from kivy.uix.gridlayout import GridLayout


class MyGridLayout(GridLayout):
    pass


class LayoutsApp(App):
    def build(self):
        return MyGridLayout()


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

layouts.kv

#:kivy 1.10.1
#:import Factory kivy.factory.Factory

<CustomDropdown@DropDown>:
    id: dropdown
    on_select:
        app.root.ids.btn.text = '{}'.format(args[1])
        self.dismiss()

    Button:
        id: btn1
        text: 'option 1'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn1.text)

    Button:
        id: btn2
        text: 'option 2'
        size_hint_y: None
        height: '48dp'
        on_release:
            dropdown.select(btn2.text)

<MyGridLayout>:
    rows: 2
    id: main_win

    Button:
        id: btn
        text: 'Press'
        on_release: Factory.CustomDropdown().open(self)
        size_hint_y: None
        height: '48dp'

    BoxLayout:

    BoxLayout:

Вывод

App Startup DropDown opened DropDown list selected

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...