[Kivy] Clock objectを使用する③ create_trigger()による繰り替えし処理の停止と再開

create_trigger()による繰り替えし処理の停止と再開

 前回は、schedule_interval()で繰り返し作業を開始、停止する方法を見ました。schedule_interval()は、一度停止すると再利用することができないので、繰り返し作業を再開する場合は再度インスタンスを作成します。このため、あまり停止と再開を繰り返す作業に使用するのには適していません。

 開始、停止をおこなう繰り返し処理の作成には、他にcreate_trigger()を使用する方法があります。create_trigger()を使用する方法では、最初に定義したトリガーイベントを使用して、それに指示をだすことで繰り返し作業の停止と再開がおこなえるので、頻繁に停止と再開をおこなうのに適しています。今回は、create_trigger()の使用した停止と再開をおこなう繰り返し処理の方法を紹介します。

今回おこなう内容
 ・ create_trigger()を使用して、繰り返し処理の停止と再開をおこなう。 

create_trigger()について

 create_trigger()はクロックイベントを作成するメソッドであり、作成したクロックイベントを操作することで、繰り返し処理もしくは1回のみの実行する関数を実行します。
 create_trigger()ではイベントを複数回呼び出すことができますが、複数回スケジュールされることが無いので、schedule_interbal()を使用した場合のように繰り返し処理の状態を管理する必要がありません。

create_trigger()の定義

 create_triggerの定義は以下のように行います。
  例:1秒周期で繰り返し、self.label_write()を実行する

        # トリガーイベントの作成
        self.event = Clock.create_trigger(
            self.label_write, timeout=1, interval=True)

create_trigger()の引数

 create_trigger()の引数は、以下の表の通りです。release_refについては、特殊なことをしないのであればTure(既定値)を使用すれば良いと思います。

引数 内容
callback callable実行する関数
timeoutfloatサンプリング周期(秒)
intervalboolTrue:タイムアウト期間を設けて実行する関数を繰り返し呼び出す。
False:実行する関数を1回呼び出す。
release_refboolTrue(既定値):実行される関数がクラスのメソッドであり、オブジェクトにそれへの参照がない場合、オブジェクトはガベージ コレクションされる可能性があり、コールバックは呼び出されない。
False:クロックはオブジェクトへの参照を保持してガベージ コレクションが行われないようにするため、オブジェクトが呼び出される。

create_trigger()での繰り返し作業の開始と停止

 定義したトリガーイベントは、以下のようにself.event()で開始、self.event.cancel()で停止します。

    # トリガーイベントの開始
    def on_start_press(self):
        self.event()

    # トリガーイベントの停止
    def on_stop_press(self):
        self.event.cancel()
        self.number = 0

サンプルプログラム

  下記プログラムを実行すると、下図のような画面が表示されます。
 ・Startボタンを押すと、1秒ごとに数値が1加算されます。
 ・Stopボタンを押すと、カウントアップが停止して数値が0に戻ります。

#: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)

        BoxLayout:
            orientation: 'horizontal'
            spacing: 20

            Button:
                id: start
                text: 'Start'
                on_press: root.on_start_press()

            Button:
                id: stop
                text: 'Stop'
                on_press: root.on_stop_press()
# -*- coding: utf-8 -*-

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)
    # timer = 0

    def __init__(self, **kwargs):
        super(ClockTestWidget, self).__init__(**kwargs)

        # トリガーイベントの作成
        self.event = Clock.create_trigger(
            self.label_write, timeout=1, interval=True)

    # トリガーイベントの開始
    def on_start_press(self):
        self.event()

    # トリガーイベントの停止
    def on_stop_press(self):
        self.event.cancel()
        self.number = 0

    def label_write(self, dt):
        # 呼び出される度に値を1増やす。
        self.number = self.number + 1


class ClockTestWidgetApp(App):
    def __init__(self, **kwargs):
        super(ClockTestWidgetApp, self).__init__(**kwargs)
        self.title = 'Clock Test3'

    def build(self):
        return ClockTestWidget()


if __name__ == '__main__':
    app = ClockTestWidgetApp()
    app.run()
タイトルとURLをコピーしました