Spinnerの自作

自己流の Spinner の作成を助ける mix-in class。

(Tested on CPython3.9.7 + Kivy2.1.0)

_images/locale_chooser.png

examplesの一つ locale_chooser.py の様子

公式のSpinnerとの違い

  • 公式の Spinner の基底classは Button であるため Buttonの見た目が気に入らない人はそれを変えるための手間が僅かですがかかります。 対して KXSpinnerLikeBehavior の方は見た目に関しては何も行いません。

  • また公式の方は kivy.uix.spinner.Spinner.option_clstext という名前のプロパティを持っている事を求めますがこちらは求めません。

使い方

最初にすべきは on_release eventを持っているclassとKXSpinnerLikeBehaviorを組み合わせて本体側classを作ることです。 以下に幾つか例を示します。

class CustomSpinner(KXSpinnerLikeBehavior, Button):
    ...

class CustomSpinner(KXSpinnerLikeBehavior, ButtonBehavior, Image):
    ...

class CustomSpinner(KXSpinnerLikeBehavior, ButtonBehavior, BoxLayout):
    ...

次に選択肢を表すclassを定義します。 これは先程述べたように text プロパティが無くとも良い事を除けば kivy.uix.spinner.Spinner.option_cls と同じです。

class SpinnerOption(ButtonBehavior, Image):
    ...

class SpinnerOption(ButtonBehavior, BoxLayout):
    ...

定義できたら本体側classのinstanceに伝えます。

spinner = CustomSpinner()
spinner.option_cls = SpinnerOption

最後に選択肢のデータを spinner に渡します。 データの形式は kivy.uix.recycleview.RecycleView.data と全く同じです。 すなわち option_cls のproperty名に対応したkeyを持つ辞書のlistです。

# option_clsが規定値のままの時の一例
spinner.option_data = [
    {'text': text, } for text in "ACBDEF"
]

ユーザーがどの選択肢を選んだのかは selection を監視することでわかります。

spinner.bind(selection=lambda __, v: print(v.text, "が選ばれた"))
class kivyx.uix.behaviors.spinner.KXSpinnerLikeBehavior(**kwargs)[source]

Bases: object

auto_select = None

何も選ばれていない時 auto_select 番目の選択肢が自動で選ばれる。

dropdown_cls

公式と同じ。

option_cls

text プロパティが要らない事を除けば公式と同じ。

option_data

kivy.uix.recycleview.RecycleView.data と同じ。

option_padding = [0, 0, 0, 0]

選択肢とその入れ物間の隙間。 kivy.uix.boxlayout.BoxLayout.padding に対応。

option_spacing = [0, 0]

選択肢同士の隙間。 kivy.uix.boxlayout.BoxLayout.spacing に対応。

selection = None

(read-only) 現在選ばれている選択肢( option_cls のinstance)。

sync_height = False

公式と同じ。