我的问题是访问containerDropDown属性,该属性默认为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方法,但是没有结果。没有设置缩进。我也想以奇异果语言查看解决方案,因为我想使用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()


不直接支持使用自定义容器类。您可以这样操作,但它既笨拙又丑陋:

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()


因此,我想将自定义间距类作为Widget的子类来填充按钮之间的空间更为干净:

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类而不是没有文本的Label

关于python - 在kivy中的下拉项目之间添加间距,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43479571/

10-12 18:32