[Kivy] Clock objectを使用する② schedule_interval()作業の開始と停止

schedule_interval()作業の開始と停止

 schedule_interval()は任意のタイミングで開始したり、停止することができます。この機能を使用すれば、任意のタイミングから処理を設定した回数だけおこなうという指定もおこなえるようになります。

 前回は、実行するとすぐに繰り返し処理をおこなうプログラムの作成方法を紹介しましたが、今回は表示されるウィンドウにあるStartボタンを押すことでカウントアップが開始され、Stopボタンを押すことでカウントが停止するものを作成する方法を紹介します。

今回紹介する内容
 ・ schedule_interval()の開始([Kivy] Clock objectを使用する①と同じ内容)
 ・ schedule_interval()の停止

schedule_interval()の制御

schedule_interval()の開始

 schedule_intervale()をButtonのイベントon_press内に記入すると、Startボタンを押す度にClock.schedule_interval()が実行されます。このため、Clock.schedule_interval()を重複して実行させないためには、以下のように変数self.timerが0の場合のみ実行して、実行後はself.timerの値を変更するなどの工夫が必要です。

# Startボタンを押した場合の処理
    def on_start_press(self):
        if self.timer == 0:
            # 1秒周期で、self.label_write()を実行
            Clock.schedule_interval(self.label_write, 1)
            print('schedule_intervalを実行しました。')
            self.timer = 1
        else:
            print('schedule_intervalは既に実行しています。')

schedule_interval()の停止

 schedule_interval()の繰り返し作業は、繰り返し処理の関数(Clock.schedule_intervalで指定した関数)側でFalseを返すと停止します。このため、Stopボタンを押すと変数self.timerの値を0に変更するようにして、繰り返し処理の関数で変数self.timerの値が0の場合はFalseを返すように指定して、schedule_interval()を任意のタイミングで停止させることができるようにしています。

    # Stopボタンを押した場合の処理
    def on_stop_press(self):
        if self.timer == 1:
            self.timer = 0        
        else:
            print('schedule_intervalを実行していません。')

    # scedule_interval()で指定した繰り返す関数
    def label_write(self, dt):
        if self.timer == 0:
            self.number = 0
            print('schedule_intervalを停止しました。')
            return False
        else:
            # 呼び出される度に値を1増やす。
            self.number = self.number + 1
            return True

サンプルプログラム

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

 数値のカウントアップは、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)

        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
    scedule =  None

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

    # Startボタンを押した場合の処理
    def on_start_press(self):
        if self.timer == 0:
            # 1秒周期で、self.label_write()を実行
            Clock.schedule_interval(self.label_write, 1)
            print('schedule_intervalを実行しました。')
            self.timer = 1
        else:
            print('schedule_intervalは既に実行しています。')

    # Stopボタンを押した場合の処理
    def on_stop_press(self):
        if self.timer == 1:
            self.timer = 0        
        else:
            print('schedule_intervalを実行していません。')

    # scedule_interval()で指定した繰り返す関数
    def label_write(self, dt):
        if self.timer == 0:
            self.number = 0
            print('schedule_intervalを停止しました。')
            return False
        else:
            # 呼び出される度に値を1増やす。
            self.number = self.number + 1
            return True


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

    def build(self):
        return ClockTestWidget()


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