組み込み技術を向上したい!!

でも組み込み以外にも手を出し始めました・・・

RaspberryPi2 + kivy Slider

kivyに触れた次いでにSliderもやってみた。

まずはシンプルに触れてみる

from kivy.base import runTouchApp

from kivy.app import App
from kivy.uix.button import Label, Button
from kivy.uix.slider import Slider
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.Slider1Title = Label(text="Slider1", font_size = "18sp",
                size_hint=(.3, .2), pos_hint={'center_x': .30, 'center_y': 0.8})
        self.add_widget(self.Slider1Title)
        self.SampleSlider1 = Slider(min=0, max=10, value=10,orientation='vertical',
                step=0.5, size_hint=(.05, .5),pos_hint={'center_x': .30, 'center_y': 0.45})
        self.SampleSlider1.bind(value=self.SampleSlider1callback)
        self.add_widget(self.SampleSlider1)
        self.Slider1Value = Label(text="xxx", font_size = "18sp",
                size_hint=(.3, .2), pos_hint={'center_x': .30, 'center_y': 0.75})
        self.Slider1Value.text=str(self.SampleSlider1.value)
        self.add_widget(self.Slider1Value)
        
    def SampleSlider1callback(self,instance,value):
        self.Slider1Value.text=str(self.SampleSlider1.value)
        
class TestApp(App):
    def build(self):
        self.root = root = RootWidget()
        self.title = 'Test Sample'
        return self.root
TestApp().run()

として、とりあえず、縦(Vertical)なスライダーを作ってみた。

orientation='vertical'

で縦スライダーね。何も指定しなければhorizontalで横スライダーね。スライダー、スライダーって何か野球みたいね…。callbackで値が変化する度に値を表示するテキストを更新する。

もう少し深く触れてみる

from kivy.base import runTouchApp

from kivy.app import App
from kivy.uix.button import Label, Button
from kivy.uix.slider import Slider
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.Slider1Title = Label(text="Slider1", font_size = "18sp",
                size_hint=(.3, .2), pos_hint={'center_x': .30, 'center_y': 0.8})
        self.add_widget(self.Slider1Title)
        
        self.SampleSlider1 = Slider(min=0, max=10, value=10,orientation='vertical',
                step=0.5, size_hint=(.05, .5),pos_hint={'center_x': .30, 'center_y': 0.45})
        self.SampleSlider1.bind(value=self.SampleSlider1callback)
        self.add_widget(self.SampleSlider1)
        
        self.Slider1Value = Label(text="xxx", font_size = "18sp",
                size_hint=(.3, .2), pos_hint={'center_x': .30, 'center_y': 0.75})
        self.Slider1Value.text=str(self.SampleSlider1.value)
        self.add_widget(self.Slider1Value)

        self.Slider2Title=Label(text="Slider2", font_size = "18sp",
                size_hint=(.3, .2), pos_hint={'center_x': .50, 'center_y': 0.8})
        self.add_widget(self.Slider2Title)
        
        self.SampleSlider2 = Slider(min=0, max=10, value=3,orientation='vertical',
                step=0.5, size_hint=(.05, .5),pos_hint={'center_x': .50, 'center_y': 0.45})
        self.SampleSlider2.bind(value=self.SampleSlider2callback)
        self.add_widget(self.SampleSlider2)
        
        self.Slider2Value=Label(text="xxx", font_size = "18sp",
                size_hint=(.3, .2), pos_hint={'center_x': .50, 'center_y': 0.75})
        self.Slider2Value.text=str(self.SampleSlider2.value)
        self.add_widget(self.Slider2Value)
         
    def SampleSlider1callback(self,instance,value):
        if self.SampleSlider1.value < self.SampleSlider2.value:
            self.SampleSlider1.value += 0.5
        self.Slider1Value.text=str(self.SampleSlider1.value)
        
    def SampleSlider2callback(self,instance,value):
        if self.SampleSlider1.value < self.SampleSlider2.value:
            self.SampleSlider2.value -= 0.5
        self.Slider2Value.text=str(self.SampleSlider2.value)
        
class TestApp(App):
    def build(self):
        self.root = root = RootWidget()
        self.title = 'Test Sample'
        return self.root
TestApp().run()

とするとSample1はSample2より小さい値は設定できなくなり、Sample2はSample1より大きい値は設定できなくなる。ここで面白いのはSample1が10でSample2が5だったとすると、Sample1の値をスライドさせて変更せずに0付近をタッチして一気に変化させようとしてもできないこと。つまり、見た目には一気に値が変わっているように見えても、step数ずつ細かく値が更新されていることになる。処理が高速だから全く気にならないけどね。

callback関数でprint("sample1 callback")とかしてコンソールで動作を見てみると、ああスライダーがんばってんなぁって思う。

こんな便利なフレームワークをMITライセンスで提供してくれるなんてすばらしい人たちもいるものだ。

sunnydays-k.hatenablog.com

sunnydays-k.hatenablog.com