【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を調べると良いと思います。
最後までお読みいただきありがとうございます。
スポンサードサーチ