RaspberryPi2 + kivy ToggleButton... as RadioButton
先日RaspberryPi2でkivyを触ってみたので、その続き。
前回の内容は↓
ToggleButtonを使ってみる
kivyのButtonにはToggle機能を持ったものがあるらしい。ということで実際に使ってみた。
from kivy.base import runTouchApp from kivy.app import App from kivy.uix.button import Label, Button from kivy.uix.togglebutton import ToggleButton from kivy.config import Config from kivy.uix.floatlayout import FloatLayout from kivy.core.window import Window Config.set('graphics', 'width', '200') Config.set('graphics', 'height', '200') class RootWidget(FloatLayout): def __init__(self, **kwargs): super(RootWidget, self).__init__(**kwargs) self.Sample1Btn = ToggleButton(text="Sample1", font_size = "18sp",group='hogehoge', state='down',size_hint=(.3, .15), pos_hint={'center_x': .2, 'center_y': .7}) self.Sample1Btn.bind(on_press=self.Sample1Btncallback) self.add_widget(self.Sample1Btn) self.Sample2Btn = ToggleButton(text="Sample2",font_size="18sp",group='hogehoge', size_hint=(.3, .15), pos_hint={'center_x': .2, 'center_y': .5}) self.Sample2Btn.bind(on_press=self.Sample2Btncallback) self.add_widget(self.Sample2Btn) def Sample1Btncallback(self,instance): if self.Sample1Btn.state != 'down': self.Sample1Btn.state='down' def Sample2Btncallback(self,instance): if self.Sample2Btn.state != 'down': self.Sample2Btn.state='down' class TestApp(App): def build(self): self.root = root = RootWidget() self.title = 'Test Sample' return self.root TestApp().run()
みたいな感じで実装してみた。
ToggleButtonはクリックして押された(down)状態、又は押されていない状態を保持するためのbuttonだと思うけど、group化することで、groupの内どれか一つしか押された(down)状態となれないようにできる。
しかし、group化するだけだと、down状態のbuttonをもう一度クリックするとgroup化されたbuttonの内、どれもdown状態でない状態となってしまう。何か気持ち悪いので、callbackを使って、down状態のときにクリックされても、down状態を維持するようにしてみた。
radioボタン的な使い方をしてみたわけ。こっちの方がしっくりきた。
次はSliderだな・・・。
追記
上記で作成したToggleButtonを押したまま指をスライドさせると、意図しないトグル動作をしてしまう。対策として、
ToggleButton(always_release=True)
のように、ToggleButtonのパラメータにalways_release=Trueを追加してやるといい。