Kivy 简明教程
Kivy - Dropdown List
Kivy 中的下拉小部件与其他 GUI 工具包中的类似小部件非常不同。Kivy 的下拉列表不仅显示标签,还显示任何其他小部件,例如按钮、图像等。
DropDown 类在“kivy.uix.dropdown”模块中定义。
from kivy.uix.dropdown import DropDown
dropdown=DropDown()
构建下拉对象需要以下步骤 −
-
在此对象中添加其他小部件时,我们需要通过禁用 size_hint 手动指定高度,从而下拉列表计算所需区域。
-
针对在 DropDown 中添加的每个子控件,你需要附加一个会调用下拉列表中 select() 方法的回调。绑定每个子对象并添加到下拉列表对象。
-
将下拉列表添加到一个主按钮并用下拉列表类的 open() 方法将其绑定
-
最后,运行应用程序并单击主按钮。你将看到一个子控件列表下拉。单击其中的任何一个控件以调用其关联的回调。
Example
在此示例中,我们将演示 Kivy 中的下拉列表控件如何工作。应使用 for 循环将十个按钮添加到下拉列表,如下所示:
dropdown = DropDown()
for index in range(1, 11):
btn = Button(text ='Button '+str(index),
size_hint_y = None, height = 40)
btn.bind(on_release = lambda btn: dropdown.select(btn.text))
dropdown.add_widget(btn)
box.add_widget(dropdown)
我们在 BoxLayout 中放置一个主按钮,将下拉列表对象添加到其中,并将主按钮绑定到下拉列表对象的 open() 方法。
box = BoxLayout(orientation='vertical')
mainbutton = Button(text ='Drop Down Button', size_hint=(None, None), size =(250, 75), pos_hint ={'center_x':.5, 'top':1})
box.add_widget(mainbutton)
mainbutton.add_widget(dropdown)
mainbutton.bind(on_release = dropdown.open)
最后,我们需要监听下拉列表中的选择并为按钮文本分配数据。
dropdown.bind(on_select = lambda instance, x: setattr(mainbutton, 'text', x))
所有这些步骤都包含在以下代码的 App 类的 build() 方法中:
from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
Window.size = (720, 400)
class Drop_down_app(App):
def build(self):
box = BoxLayout(orientation='vertical')
mainbutton = Button(
text='Drop Down Button', size_hint=(None, None),
size=(250, 75), pos_hint={'center_x': .5, 'top': 1}
)
box.add_widget(mainbutton)
dropdown = DropDown()
for index in range(1, 11):
btn = Button(text='Button ' + str(index),
size_hint_y=None, height=40)
btn.bind(on_release=lambda btn: dropdown.select(btn.text))
dropdown.add_widget(btn)
box.add_widget(dropdown)
mainbutton.add_widget(dropdown)
mainbutton.bind(on_release=dropdown.open)
dropdown.bind(on_select=lambda instance, x: setattr(mainbutton, 'text', x))
return box
Drop_down_app().run()