【问题标题】:Adding spacing between dropdown items in kivy在kivy中添加下拉项目之间的间距
【发布时间】:2017-04-18 18:23:46
【问题描述】:

我的问题是访问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 文件不是很方便。提前感谢您的帮助。

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    您应该直接设置值而不是使用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

    【讨论】: