在kivy中添加下拉项之间的间距

Adding spacing between dropdown items in kivy

我的问题是访问 DropDowncontainer 属性,默认情况下它是 GridLayout 并包含它的子项。

简单的应用程序:

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.label import Label


class TestApp(App):
    def build(self):
        root = BoxLayout(orientation='vertical')
        dropdown = DropDown()

        for i in range(3):
            dropdown.add_widget(Button(
                text=str(i),
                size_hint_y=None
            )) # add 3 buttons to dropdown

        dropdown.container.bind(spacing=8) # this line does not work

        dropdown_button = Button(size_hint_y=.2, text='Open DropDown')
        dropdown_button.bind(on_release=dropdown.open)

        root.add_widget(dropdown_button)
        root.add_widget(Label()) # empty space under button
        return root

TestApp().run()

我尝试使用 bind 方法,但没有结果。没有设置缩进。我也想看看 kivy 语言的解决方案,因为我想使用 dp() 函数来设置间距,为此将参数传递给 python 文件不是很方便。在此先感谢您的帮助。

您应该直接设置值,而不是使用 bind

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.widget import Widget


class TestApp(App):
    def build(self):
        root = BoxLayout(orientation='vertical')
        dropdown = DropDown()

        for i in range(3):
            dropdown.add_widget(Button(
                text=str(i),
                size_hint_y=None
            )) # add 3 buttons to dropdown

        dropdown.container.spacing = 10
        dropdown.container.padding = (0, 10, 0, 0)

        dropdown_button = Button(size_hint_y=.2, text='Open DropDown')
        dropdown_button.bind(on_release=dropdown.open)

        root.add_widget(dropdown_button)
        root.add_widget(Widget()) # empty space under button
        return root

TestApp().run()

不直接支持使用自定义容器 class。你可以这样做,但它很笨拙和丑陋:

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.widget import Widget

from kivy.lang import Builder

Builder.load_string('''
<MyContainer>:
    # copied from kivy.uix.dropdown._grid_kv
    size_hint_y: None
    height: self.minimum_size[1]
    cols: 1
    # custom settings
    spacing: 10
    padding: (0, 10, 0, 0)
''')

class MyContainer(GridLayout):
    pass


class TestApp(App):
    def build(self):
        root = BoxLayout(orientation='vertical')

        container = MyContainer()
        dropdown = DropDown(container=container)
        super(DropDown, dropdown).add_widget(container)
        dropdown.on_container(dropdown, container)

        for i in range(3):
            dropdown.add_widget(Button(
                text=str(i),
                size_hint_y=None
            )) # add 3 buttons to dropdown

        dropdown_button = Button(size_hint_y=.2, text='Open DropDown')
        dropdown_button.bind(on_release=dropdown.open)

        root.add_widget(dropdown_button)
        root.add_widget(Widget()) # empty space under button
        return root

TestApp().run()

所以我想说,将自定义间距 class 作为 Widget 的子 class 来填充按钮之间的 space 会更干净:

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.widget import Widget

from kivy.lang import Builder

Builder.load_string('''
<DropDownSpacing>:
    size_hint_y: None
    height: 20
''')

class DropDownSpacing(Widget):
    pass


class TestApp(App):
    def build(self):
        root = BoxLayout(orientation='vertical')
        dropdown = DropDown()

        for i in range(3):
            dropdown.add_widget(DropDownSpacing())

            dropdown.add_widget(Button(
                text=str(i),
                size_hint_y=None
            )) # add 3 buttons to dropdown

        dropdown_button = Button(size_hint_y=.2, text='Open DropDown')
        dropdown_button.bind(on_release=dropdown.open)

        root.add_widget(dropdown_button)
        root.add_widget(Widget()) # empty space under button
        return root

TestApp().run()

这与您在主要 BoxLayout 中所做的相同,只是我更喜欢直接使用 Widget class 而不是不带文本的 Label