Start_python’s diary

ふたり暮らし

アラフィフ夫婦のフリーランスプラン

Kivyでスライダー(slider)を使ってみる(Python タイマー作成2)

スライダーとは?

ITの分野では、コンピュータの操作画面で、棒状の領域の上に現在位置を指し示す小さな印を表示し、これを利用者が上下あるいは左右に移動させることで値や範囲を指示する入力要素のことをスライダーという。厳密には、現在位置を表す印をスライダー、スライダーが移動できる棒状の領域をスライダーバー(slider bar)という。

スライダーバーは、ウィンドウの表示領域を指し示すものはスクロールバー(scroll bar)とも呼ばれ、音声や動画の再生ソフトで現在の再生位置を指し示すものはシークバー(seek bar)とも呼ばれる。

 

本日の課題と目標

カウントダウンの初期値を変更する

スライダー(slider)を利用する

 

はじめに

今回は スライダー(slider)を使ってカウントダウンの最初の数字を決めます。

スライダーという名前がわからずになかなか検索できませんでした。ほかの言い方はないのでしょうか。

 

f:id:Start_python:20191114155811g:plain

 

プログラムのコード

# フル画面を解除して画面の幅と高さを設定
from kivy.config import Config
Config.set('graphics', 'fullscreen', '0')
Config.set('graphics', 'width', '300')
Config.set('graphics', 'height', '150')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import StringProperty 
from kivy.clock import Clock


class KivyTimer(Widget):
    # プロパティの追加
    text = StringProperty()

    def on_slider(self):
        self.text=str(int(self.ids.slider1.value))

    # ボタンをクリック時
    def on_command(self, **kwargs):
        #if self.text == 'OK!':
        #    self.text = '3'
        Clock.unschedule(self.on_countdown)
        Clock.schedule_interval(self.on_countdown, 1.0)

    def on_countdown(self, dt):
        self.text = str(int(self.text) - 1)
        if int(self.text) == 0:
            self.text = 'OK!'
            return False

    def __init__(self, **kwargs):
        super(KivyTimer, self).__init__(**kwargs)
        self.text = '3'


class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)
        # ウィンドウのタイトル名
        self.title = 'test'

    def build(self):
        return KivyTimer()

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

kvファイル (test.kv)

<KivyTimer>:

    Slider:
        id:slider1
        max:10
        min:1
#        range: 1,10
        value: 3
        size: 16,16
        cursor_width: 16
        cursor_height: 16
#        cursor_size:16,16
        width:200
        pos: 50,70
        step:1
        on_touch_up: root.on_slider()
        on_touch_move: root.on_slider()

    Label:
        id: label1
        size: 300,100
        pos: 0,60
        font_size: 32
        text: root.text

    Button:
        id: button1
        size: 100,50
        pos: 100,10
        text: "Start"
        font_size: 24
        on_press: root.on_command()

 

解説

kvファイルに「Slider」の情報を追加して

def on_slider(self):
    self.text=str(int(self.ids.slider1.value))

上の2行を前回のプログラムに追加しました。

 

変更したところは、前回のままだとボタンを2回連続で押すとエラーが起こってました。(Clockオブジェクトが二重に動作しているためだと思います)

そこで

#if self.text == 'OK!':
#    self.text = '3'

上の2行を消して、下の1行を足すとこで解決しました。

Clock.unschedule(self.on_countdown)

これで一度タイマーを止めて(コールバックのスケジュールを解除する)あらためてタイマーを作動さすことができます。

 

プログラムの流れ

初期のラベル文字をスライダーで変更し、ボタンをクリック時にラベルの文字を1秒毎にー1して表示します。「0」になったら「OK!」を表示するプログラムです。

どのタイミングでも再びボタンを押すと最初からカウントダウンを始めます。カウントダウン中にスライダーで残り時間を変更も出来ます。

 

 

次回は文字入力ボックスを作ってみたいと思います。

 

 

参考サイト

rashata.wp.xdomain.jp

qiita.com

 

 

保存ファイル

lesson35.py

 

 

 文責:Luke