Kivy 简明教程

Kivy - Spinner

Kivy 框架中的 Spinner 控件是一种更传统的下拉控件类型,不同于 Kivy 的 DropDown 小部件。与 DropDown相比,构造和使用 Spinner 小部件更加容易和方便。

Kivy 的下拉菜单和小部件之间主要的区别是,下拉菜单小部件可能包含任何其他 Kivy 小部件,例如标签、按钮、图像等;而下拉菜单只是字符串的列表。

Spinner 类在“kivy.uix.spinner”模块中定义

from kivy.uix.spinner import Spinner
spin = Spinner(**kwargs)

Spinner 小部件显示与当前选择的值相对应的文本标题。Spinner 对象可以用不同的属性构造,作为关键字参数。但是,这两个属性很重要 -

  1. text 属性是一个字符串,显示默认值。

  2. values 属性是一个 ListProperty,包含从中选择的所有值。

要构造一个简单的下拉列表,请使用以下代码段 -

from kivy.base import runTouchApp
from kivy.uix.spinner import Spinner

spinner = Spinner(
   text='English',
   values=('English', 'French', 'German', 'Chinese')
)

下拉列表对象的文本属性可以绑定到一个回调,以便在进行选择时调用适当的操作。

def value_changed(spinner, text):
   print(You selected', text, 'language')

spinner.bind(text=show_selected_value)

Spinner 类中的其他属性如下所列 -

  1. dropdown_cls - 一个类,用于在按下 Spinner 时显示下拉列表。它是一个 ObjectProperty,默认为 DropDown。

  2. is_open - 默认情况下,下拉列表不打开。设置为 True 以打开它。

  3. option_cls - 一个类,用于显示 Spinner 下方显示的下拉列表中的选项。该类的文本属性将用于表示该值。它的 on_release 事件用于在按下/触摸时触发该选项。

  4. text_autoupdate - 这是一个 BooleanProperty。它表示下拉列表的文本是否应使用 values 属性的第一个值自动更新。将其设置为 True 将导致下拉列表在每次更改值时更新其文本属性。

  5. values - 用户可以选择的值。它必须是字符串列表。它是一个 ListProperty,默认为 []。

下面的代码组合了一个 Spinner,它与一个标签关联,以在水平框中显示选定的值。较低的水平框有一个 TextInput 和一个 Button。目的是在此按钮上提供一个回调,将文本框中的字符串添加到 Spinner 值

程序在 App 类中有两个回调方法。一个用于显示从下拉菜单中选定的值,另一个用于向下拉菜单中添加新语言。

用于添加新语言的回调——

def addvalue(self, instance):
   self.spin1.values.append(self.t1.text)

我们要将这个方法绑定到“添加”按钮上。

要在标签上显示选定的语言——

def on_spinner_select(self, spinner, text):
   self.spinnerSelection.text = "Selected Language is: %s" %self.spin1.text

我们要将这个方法绑定到下拉菜单小部件的“文本”属性上。

Example

将以下代码另存为“spiinerdemo.py”并运行

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.spinner import Spinner
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.core.window import Window

Window.size = (720, 400)

class SpinnerExample(App):
   def addvalue(self, instance):
      self.spin1.values.append(self.t1.text)

   def build(self):
      layout = BoxLayout(orientation='vertical')
      lo1 = BoxLayout(orientation='horizontal')
      self.spin1 = Spinner(
         text="Python",
         values=("Python", "Java", "C++", "C", "C#", "PHP"),
         background_color=(0.784, 0.443, 0.216, 1),
         size_hint=(.5, .4), pos_hint={'top': 1}
      )
      lo1.add_widget(self.spin1)
      self.spinnerSelection = Label(
         text="Selected value in spinner is: %s" % self.spin1.text,
         pos_hint={'top': 1, 'x': .4}
      )
      lo1.add_widget(self.spinnerSelection)
      layout.add_widget(lo1)
      lo2 = BoxLayout(orientation='horizontal')
      lo2.add_widget(Label(text="Add Language"))
      self.t1 = TextInput()

      self.b1 = Button(text='add')
      lo2.add_widget(self.t1)
      lo2.add_widget(self.b1)
      layout.add_widget(lo2)
      self.spin1.bind(text=self.on_spinner_select)
      self.b1.bind(on_press=self.addvalue)
      return layout

   def on_spinner_select(self, spinner, text):
      self.spinnerSelection.text = "Selected value in spinner is: %s" % self.spin1.text
      print('The spinner', spinner, 'have text', text)

if __name__ == '__main__':
   SpinnerExample().run()

Output

左上角的按钮是下拉菜单。点击时,语言列表将下拉显示。你可以进行选择。选中的名称将显示在其右侧的标签上。

kivy spinner

要向列表中添加新语言,请在文本框中输入内容,然后点击“添加”按钮。下拉菜单小部件将在底部添加新的语言名称。如果列表足够长,你可以用鼠标向下滚动。