2017-04-18 62 views
1

我的问题是在访问DropDowncontainer属性,默认情况下它是GridLayout并且包含它的子项。在kivy中添加下拉项之间的间距

简单的应用程序:

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文件不太方便。预先感谢您的帮助。

回答

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

所以我要说它会更加清洁,使自定义间隔类作为控件的子类按钮之间填充空间:

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而没有文本。

相关问题