なりなり日記

Appleと折りたたみ自転車(BROMPTON / Tern Vektron S10 / BESV PSF1)の情報を中心に発信中!

【Python入門】tkinkerでタイマーを作る


スポンサーリンク

こんにちは、なりなりです(^ ^)

【Python入門】Pythonistaでタイマーを作る(2) - なりなり日記

Pythonistaでのタイマーの使い方を勉強しましたが、一度脱線して、PCならどうするのか?やってみます(^-^)

TKと聞けば、プラグラムに詳しい人はピンと来ますよね、きっと。僕は知りませんでしたけど。

PythonにはGUIを構築するためのモジュールTKが標準で組み込まれているのです。

僕はGUIとかイベントドリブン型のプラグラムは、ポーランドのC++ Builder(Visual BASICのC++版といいましょうか)でしか組んだことが無いので、ソースコードだけで書くというのがピンと来ないんです(⌒-⌒; )

tkinkerを使ったタイマーの例がこちら。

# coding: utf-8

from tkinter import *

def timer():
   time = int(buff.get())
   if time > 0:
       frame.after(1000, timer)
       time -= 1
       buff.set(str(time))

frame = Tk()

buff = StringVar()
buff.set('10')

entry  = Entry(frame, textvariable = buff)
entry.pack(side='left')
button = Button(frame, text = 'START', command = timer)
button.pack(side='right')

frame.mainloop()

一番上の方に定義したtimer関数の中に有りますが、tkにはthreadingのTimerに似たメソッドafterが有るので、threadingは不要です。

今回は、tkinkerの中のテキスト入力ボックスのEntryとButtonのウィジェットを使います。

では、インタラクティブモードでウィジェットが出来上がる様子を見ましょう!

frame = Tk()

でtkのインスタンスframeを生成し


buff = StringVar()
buff.set('10')

tkのウィジェットと文字列をやりとりするにはStringVarでインスタンスを生成します。ここではsetメソッドで10に初期化。

entry  = Entry(frame, textvariable = buff)
entry.pack(side='left')

frame上にEntryのインスタンスを生成し、textvariable(変化する文字列)にbuffを関連付けてから、frameに詰め込んで表示(pack)します。この時、Entryは左に配置。


するとこうなります。

更に、

button = Button(frame, text = 'START', command = timer)
button.pack(side='right')

Buttonのテキストに「START」を指定して、ボタンを押した時のコール関数に「timer」を紐付けて、frame上にインスタンスを生成します。Buttonは右に配置。


するとこうなり、mainloopの実行でボタン押し待ちの状態になります。


こんな感じに、ソースコードだけでGUIとかイベントドリブン型のプラグラムとか作れるんですね。


実は、この辺の感覚が無かったので

初めてのGARMIN Connect IQプログラミング vol.3【基礎編】 - なりなり日記

GARMIN Connect IQのプログラミングが暗礁に乗り上げてしまったのですが、ひょっとして再開出来るかも!

追記

Windows上で.pyをPythonに関連付けてある場合、ダブルクリックでプログラムが起動しますが、同時にShell Windowが開いてしまって鬱陶しいです。

この場合、拡張子を.pywにするだけで解決します!

.pyはpython.exeに、.pywはpythonw.exeに関連付けられていることに依るようですが、詳細は分かりません(⌒-⌒; )

VBS(Visual BASIC Script)を使う手も有るようですが、拡張子変更の方が遥かに簡単ですね(^-^)