Вопрос 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
Вопрос 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
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:
Вывод