Brythonにおけるタイマ処理
Brthonでタイマ処理を実装する場合、time.sleep()メソッドとスレッドクラスの継承を用いても、ブラウザで適切に処理されない(Chromeで実行した場合、処理の冒頭に反応がなく、ある程度の時間後にそれまでの処理が一挙に実行され、その後正常なタイマ処理が続行された)。
Brython固有の機能としてbrowser.timerモジュールにJavaScriptのintervalやtimeoutに相当する以下のメソッド群が用意されている。
- set_interval()/clear_interval
- set_timeout()/clear_timeout()
- request_animation_frame()/cancel_animation_frame
これらはJavaScriptのそれぞれに相当する関数のwrapperであり、JavaScriptの仕様に従っていると考えられる。
JavaScriptのタイマ関係の関数についてはこちらを参照。
interval
基本形
timerパッケージのset_interval()メソッドで一定時間間隔で関数を起動し、clear_interval()メソッドでタイマーの実行を停止する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<input type="button" id="btn_interval" value="Click"></input> <input type="text" id="txt_interval"></input> <script type="text/python"> from browser import document as doc from browser import timer tmr = None is_running = False animation_flag = True def show(): global animation_flag if animation_flag: doc['txt_interval'].value = '□' animation_flag = False else: doc['txt_interval'].value = '■' animation_flag = True def switch_interval(): global tmr global is_running if is_running: timer.clear_interval(tmr) is_running = False else: tmr = timer.set_interval(show, 1000) is_running = True doc['btn_interval'].bind('click', switch_interval) </script> |
引数を渡す場合
ターゲットの関数に引数を渡したい場合、BrythonではJavaScriptのような文字列渡しはできないが、lambda関数式で無名関数の中でターゲットの関数に引数を渡すことができる。
1 2 3 4 5 6 7 8 9 10 11 12 |
def show(str0, str1): global animation_flag if animation_flag: doc['txt_interval'].value = str0 animation_flag = False else: doc['txt_interval'].value = str1 animation_flag = True .......... tmr = timer.set_interval(lambda: show('□■', '■□'), 1000) |
こちらのデモにもtimer.set_interval()
を利用している。