Kivy развернуть и свернуть панель, чтобы скрыть внутренности - PullRequest
0 голосов
/ 22 апреля 2020

Я новичок в 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()

Изображение всего коробка рухнула

1 Ответ

0 голосов
/ 22 апреля 2020

Один из способов сделать это - написать метод для этого в классе CButton:

class CButton(Button):
    def exp_or_collapse(self, box):
        if box.height == self.height:
            # expand
            for child in box.children:
                child.height = 40
                child.opacity = 1
        else:
            # collapse
            for child in box.children:
                if child != self:
                    child.height = 0
                    child.opacity = 0

Затем использовать его в файле kv:

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: self.exp_or_collapse(box)
            CLabel:
                text: "abc"
            CLabel:
                text: "abc"
            CLabel:
                text: "abc"
            CLabel:
                text: "abc"

Перемешивание непрозрачности необходимо, чтобы полностью скрыть CLabels, поскольку Label будет отображать text, даже если его размер равен 0.

Приведенный выше код предназначен для обработки только CLabels и CButtons в Box. Чтобы расширить его для обработки общих дочерних элементов Box, exp_or_collapse() можно изменить следующим образом:

class CButton(Button):
    removedChildren = ListProperty([])

    def exp_or_collapse(self, id):
        if len(self.removedChildren) > 0:
            # expand:
            # re-add all children
            self.removedChildren.reverse()
            for child in self.removedChildren:
                id.add_widget(child)
            self.removedChildren = []
        else:
            # collapse
            # remove all children (except ourself)
            for child in id.children:
                if child != self:
                    self.removedChildren.append(child)
            for child in self.removedChildren:
                id.remove_widget(child)
...