【Kivy】処理と処理の間で任意の時間待つ方法

kivyで処理と処理の間で任意の時間待つ方法を紹介するサムネイル

今回は、kivyで処理と処理の間で任意の時間待つ方法を紹介します。任意の時間待つ方法として1番最初に思い浮かぶのは、「time.sleep(sec)」だと思います。しかしGUIにおいて、time.sleep(sec)は愚策です。

 

誤字脱字など何かございましたらご連絡お願いいたします。

 

 

スポンサードサーチ


処理と処理の間で任意の時間待つ方法

解決方法を表す画像

処理と処理の間で任意の時間を待つには、「yield」と「Clock.schedule_once(func, sec)」を使って実現します。

 

以下のコードを使用することで、実現することができます。

import kivy
kivy.require('1.11.1')

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.floatlayout import FloatLayout


def func01(task):
    # Null Value = nv
    def func02(nv):
        try:
            sec = task.__next__()
            Clock.schedule_once(func02, sec)
        except StopIteration:
            pass
    func02(None)
    pass

def task01():
    a = 'I am a college student.'
    print(a)
    yield 1

    d = 'I like Python.'
    print(d)
    yield 3

    g = 'Python is a Programming Language.'
    print(g)


class kivy_test01App(App):
    def build(self):
        root = FloatLayout()
        root.bind(on_touch_down=self.on_touch_down)
        return root
    def on_touch_down(self, *args):
        func01(task01())

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

 

 

コードの解説

主に、「func01関数」、「func02関数」、「task01関数」で実現しています。処理と処理の間で任意の時間待つ関数をタスクとします。

 

9行目~18行目の「func01関数」は、後述するfunc02関数にタスクを渡すための関数です。

11行目~16行目の「func02関数」は、「Clock.schedule_once(func, sec)」を実行してsec秒後にfuncを実行します。

ここでは「func = func02」であるため、sec秒後にfunc02自身を実行します。

secは、タスクからyieldで返される値です。また12、15行目の「try~except…文」は、タスクでyield文から値が返されなくなったときに発生するエラーへの対処です。

 

func02関数がfunc01関数の中で定義されている理由は、func01関数の引数から代入されるタスクをfunc02関数でも使用するためです。
func02関数で引数をしていしない理由は、schedule_onceで指定する関数には引数を与えることが出来ないからです。

 

20行目~30行目の「task01」は、処理と処理の間で任意の時間を空けたい関数です。

21、22行目を処理1とします。25、26行目を処理2とします。さらに、29、30行目を処理3とします。

処理1と処理2の間で時間を空けたい場合は、yieldにその秒数分だけ記述します。処理2処理3の間でも同様です。

 

図で示します。

処理と処理の間を任意の時間待つプログラムを図式化した画像

 

 

動作確認

コマンドプロンプトを起動し、ファイルを保存したフォルダまで移動します。移動したら以下のコマンドを入力し、実行します。

python kivy_test01.py

 

実行したら、全画面黒のウィンドウが表示されると思います。

実行後に生成されるウィンドウの画像

 

画面上のどこかをクリックします。クリックしたら、コマンドプロンプト上に文字列が表示されます。

「I am a college student.」と「I like Python.」の間と「I like Python.」と「Python is a Programming Language.」の間に指定した秒数の間があれば正しく動作しています。

 

 

まとめ

まとめの画像

今回は、kivyで処理と処理の間に任意の時間待つ方法を紹介しました。yieldやschedule_onceを使った、少しトリッキーな方法であったと思います。

本記事で紹介した方法が理解できなければ、yieldとschedule_onceを調べると良いと思います。

 

 

 

最後までお読みいただきありがとうございます。


スポンサードサーチ