Kivyでスライダー(slider)を使ってみる(Python タイマー作成2)
スライダーとは?
ITの分野では、コンピュータの操作画面で、棒状の領域の上に現在位置を指し示す小さな印を表示し、これを利用者が上下あるいは左右に移動させることで値や範囲を指示する入力要素のことをスライダーという。厳密には、現在位置を表す印をスライダー、スライダーが移動できる棒状の領域をスライダーバー(slider bar)という。
スライダーバーは、ウィンドウの表示領域を指し示すものはスクロールバー(scroll bar)とも呼ばれ、音声や動画の再生ソフトで現在の再生位置を指し示すものはシークバー(seek bar)とも呼ばれる。
本日の課題と目標
カウントダウンの初期値を変更する
スライダー(slider)を利用する
はじめに
今回は スライダー(slider)を使ってカウントダウンの最初の数字を決めます。
スライダーという名前がわからずになかなか検索できませんでした。ほかの言い方はないのでしょうか。
プログラムのコード
# フル画面を解除して画面の幅と高さを設定 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!」を表示するプログラムです。
どのタイミングでも再びボタンを押すと最初からカウントダウンを始めます。カウントダウン中にスライダーで残り時間を変更も出来ます。
次回は文字入力ボックスを作ってみたいと思います。
参考サイト
保存ファイル
lesson35.py
文責:Luke