一定の間隔で繰り返し処理をおこなう
Kivyで一定の間隔で繰り返し処理をしたり、時間をおいて作業をおこなう場合には、Clock objectを使用します。その内、一定の間隔で繰り返し処理をするには、イベントschedule_interval()を使用します。
今回は、Kivyで一定間隔で繰り返し処理の説明のため、Labelに表示した数字を1ずつあげるサンプルプログラムを作成について紹介します。
schedule_interval()の使用方法
scedule_interval()の設定
schedule_interval()を使用するためには、まずkivy.clockをインポートします。schedule_intervalの引数は、callback, timeout であり、callbackには実行する関数を、timeoutにはサンプリング周期(秒)を指定します。
from kivy.clock import Clock
# 省略
# 1秒周期で、self.label_write()を実行
Clock.schedule_interval(self.label_write, 1)
callback関数の設定
callbackの関数は以下のように引数(dt)を1つを持っています。dtはfloat型であり、実際のインターバル時間が入っています。
def label_write(self, dt):
# 呼び出される度に値を1増やす。
self.number = self.number + 1
# インターバルの時間(dtの値)とデータ型(dtの型)の表示
print(dt, type(dt))
※ class kivy.clock.ClockBase(**kwargs)にはkivy._clock.CyClockBaseが含まれているので、class kivy.clock.CyClockBase(**kwargs)のイベントschedule_interval()を使用できます。
kivy.clockについて
kivy.clockには以下の4種類のタイプがあり、Configの設定を変更することでどのタイプを使用するか指定できます。作成するプログラムによっては、設定を変更する必要がありますが、今回は、単純に数字を約1秒間隔でカウントアップするだけのプログラムを作成するので、デフォルトの設定を使用します。
config設定 | 使用するクラス名 | 内容 |
---|---|---|
default | kivy.clock.ClockBase | コールバックを maxfps に制限する。 |
interrupt | kivy.clock.ClockBaseInterrupt | maxfps がコールバックを制限しない、割り込み可能なクロック を使用する。コールバックはいつでも実行される。 |
free_all | kivy.clock.ClockBaseInterruptAll | フリー イベントが存在する場合は maxfps へのコールバックを制限しないが、フリーイベントが存在しない場合はイベントを fps 間隔に制限する。 |
free_only | kivy.clock.ClockBaseFreeInterruptAll | 通常のイベントは fps が制限されるが、フリーイベントは制限されない。 |
サンプルプログラム
下記プログラムを実行すると、下図のような画面が表示されて、1秒ごとに数値が1加算します。さらに、ターミナルに上記の処理をおこなうのに要した時間とその値の型を表示します。
数値のカウントアップは、kvファイルでlabelのtextと紐付けたnumber(NumeticProperty)の値を変更することで実現しています。
#:kivy 2.0
<ClockTestWidget>:
BoxLayout:
size: root.size
orientation: 'vertical'
padding: 20
canvas.before:
Color:
rgba: 0.7, 0.7, 0.7, 1
Rectangle:
size: self.size
pos: self.pos
Label:
id: label
text: 'number of times: ' + str(root.number)
# -*- coding: utf-8 -*-._clock.
import os
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.properties import NumericProperty
from kivy.lang import Builder
from kivy.clock import Clock
kivy.require('2.2.0')
Builder.load_file(os.path.dirname(__file__) + "/interface.kv")
# 画面サイズの指定
Window.size = (300, 100)
class ClockTestWidget(Widget):
number = NumericProperty(0)
def __init__(self, **kwargs):
super(ClockTestWidget, self).__init__(**kwargs)
# 1秒周期で、self.label_write()を実行
Clock.schedule_interval(self.label_write, 1)
def label_write(self, dt):
# 呼び出される度に値を1増やす。
self.number = self.number + 1
# インターバルの時間(dtの値)とデータ型(dtの型)の表示
print(dt, type(dt))
class ClockTestWidgetApp(App):
def __init__(self, **kwargs):
super(ClockTestWidgetApp, self).__init__(**kwargs)
self.title = 'Clock Test'
def build(self):
return ClockTestWidget()
if __name__ == '__main__':
app = ClockTestWidgetApp()
app.run()