Я новичок в kivy, и я пытаюсь создать виджет для свертывания и расширения после нажатия кнопки. Когда он свернут, внутренние виджеты должны быть скрыты, а когда он расширен, высота должна быть минимально возможной. Я сделал эту реализацию, но когда развернул, я не смог правильно установить высоту, и дети не прячутся при падении ... Я знаю, что уже есть виджет, который делает это в библиотеке kivyMD, но мне нужно создать другой макет для кнопки и детских, так что если кто-то может мне помочь ...
файл kivy: teeeste.kv
#:import C kivy.utils.get_color_from_hex
<CLabel@Label>:
color: 0,0,0,1
size_hint_y: None
height: 40
<CButton@Button>:
background_color: 0,0,0,0
canvas.before:
Color:
rgba: C("#455A64") if self.state == "normal" else (0.26,0.26,0.26,0.85)
RoundedRectangle:
pos: self.pos
size: self.size
radius: 10,10,10,10
size_hint: None,None
size: 300,40
<Box@GridLayout>:
canvas.before:
Color:
rgba: 1,1,1,1
RoundedRectangle:
size: self.size
pos: self.pos
radius: 10,10,10,10
cols: 1
size_hint: None,None
width: 300
height: self.minimum_height
orientation: "tb-lr"
FloatLayout:
AnchorLayout:
anchor_x: "center"
anchor_y: "top"
padding: 0,30,0,0
Box:
id: box
CButton:
text: "Press to expand or colapse"
on_release: box.height = 300 if box.height == 40 else 40
CLabel:
text: "abc"
CLabel:
text: "abc"
CLabel:
text: "abc"
CLabel:
text: "abc"
python файл:
# coding: utf-8
from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.utils import get_color_from_hex
Window.clearcolor = get_color_from_hex("#424242")
class TesteApp(App):
def build(self):
return aplicativo
aplicativo = Builder.load_file("teeeste.kv")
if __name__ == "__main__":
TesteApp().run()
Я сделал изменения, предложенные @JohnAnderson, и попытался внедрить другие блоки внутри друг друга, но иногда после нажатия кнопки «НОМЕР 3» дочерние элементы внутри остановки соответствующего блока блока расширения. Вот фактический код:
kivy: teeeste.ky
#:import C kivy.utils.get_color_from_hex
<CLabel@Label>:
color: 0,0,0,1
size_hint_y: None
height: 40
<CButton>:
background_color: 0,0,0,0
canvas.before:
Color:
rgba: C("#455A64") if self.state == "normal" else (0.26,0.26,0.26,0.85)
RoundedRectangle:
pos: self.pos
size: self.size
radius: 10,10,10,10
size_hint: 1.0,None
height: 40
<Box@GridLayout>:
canvas.before:
Color:
rgba: 1,1,1,1
RoundedRectangle:
size: self.size
pos: self.pos
size_hint: 0.8,None
height: self.minimum_height
FloatLayout:
AnchorLayout:
anchor_x: "center"
anchor_y: "top"
padding: 0,30,0,0
ScrollView:
do_scroll_x: False
size_hint: None, 0.9
width: 300
GridLayout:
cols: 1
spacing: 5
size_hint_y: None
height: self.minimum_height
Box:
id: box
cols: 1
CButton:
text: "NUMBER 1"
on_release: self.exp_or_collapse(box)
CLabel:
text: "aaa"
Box:
id: box2
cols: 1
CButton:
text: "NUMBER 2"
on_release: self.exp_or_collapse(box2)
CLabel:
text: "bbb"
Box:
id: box3
cols: 1
CButton:
text: "NUMBER 03"
on_release: self.exp_or_collapse(box3)
Box:
id: box4
cols: 1
CButton:
text: "CHILD 1"
on_release: self.exp_or_collapse(box4)
CLabel:
text: "111"
Box:
id: box5
cols: 1
CButton:
text: "CHILD 2"
on_release: self.exp_or_collapse(box5)
CLabel:
text: "222"
Box:
id: box6
cols: 1
CButton:
text: "CHILD 3"
on_release: self.exp_or_collapse(box6)
CLabel:
text: "333"
Box:
id: box7
cols: 1
CButton:
text: "CHILD 4"
on_release: self.exp_or_collapse(box7)
CLabel:
text: "444"
Box:
id: box8
cols: 1
CButton:
text: "CHILD 5"
on_release: self.exp_or_collapse(box8)
CLabel:
text: "555"
Box:
id: box9
cols: 1
CButton:
text: "CHILD 6"
on_release: self.exp_or_collapse(box9)
CLabel:
text: "666"
Box:
id: box10
cols: 1
CButton:
text: "CHILD 7"
on_release: self.exp_or_collapse(box10)
CLabel:
text: "777"
Box:
id: box11
cols: 1
CButton:
text: "CHILD 8"
on_release: self.exp_or_collapse(box11)
CLabel:
text: "888"
Box:
id: box12
cols: 1
CButton:
text: "CHILD 9"
on_release: self.exp_or_collapse(box12)
CLabel:
text: "999"
Python file: main.py
import kivy
kivy.require("1.11.0")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
class CButton(Button):
def exp_or_collapse(self, id):
if id.height == self.height:
# expand:
for child in id.children:
child.height = 40
child.opacity = 1
else:
# collapse
for child in id.children:
if child != self:
child.height = 0
child.opacity = 0
class expApp(App):
def build(self):
return Builder.load_file("exp.kv")
if __name__ == "__main__":
expApp().run()
Изображение всего коробка рухнула