前回の記事ではPythonで筋トレ用メトロノームを作成した。
thom.hateblo.jp
前々回ではTkinterを使ったGUIのサンプルを紹介した。
thom.hateblo.jp
今回は、これらを組み合わせて、GUI版の筋トレ用メトロノームを作成してみよう。
動作イメージ
動作は前回のCUI版と同じだが、設定用のテキストボックスとスタートボタンを配置した。
ちょっと右の余白がダサいんだけど、これ以上横幅を削るとタイトルバーで掴める場所がなくなって、ウインドウ移動に支障をきたすので。。
コード
import tkinter as tk import winsound from time import sleep root_window = tk.Tk() root_window.geometry("200x160") defstart_clicked(): replay = int(ent_replay.get()) count = int(ent_count.get()) high_tone = int(ent_high_tone.get()) low_tone = int(ent_low_tone.get()) duration = int(ent_duration.get()) for i inrange(replay): for j inrange(count): winsound.Beep(55*2**low_tone,duration) sleep(1) winsound.Beep(55*2**high_tone,duration*2) sleep(1) lbl_replay = tk.Label( master=root_window, text="Replay") lbl_count = tk.Label( master=root_window, text="Count") lbl_high_tone = tk.Label( master=root_window, text="High tone") lbl_low_tone = tk.Label( master=root_window, text="Low tone") lbl_duration = tk.Label( master=root_window, text="Duration") ent_replay = tk.Entry( master=root_window, width = 10) ent_count = tk.Entry( master=root_window, width = 10) ent_high_tone = tk.Entry( master=root_window, width = 10) ent_low_tone = tk.Entry( master=root_window, width = 10) ent_duration = tk.Entry( master=root_window, width = 10) btn = tk.Button( master=root_window, text="Start", command=start_clicked ) lbl_replay.place(x=5,y=5) ent_replay.place(x=70,y=5) lbl_count.place(x=5,y=30) ent_count.place(x=70,y=30) lbl_high_tone.place(x=5,y=55) ent_high_tone.place(x=70,y=55) lbl_low_tone.place(x=5,y=80) ent_low_tone.place(x=70,y=80) lbl_duration.place(x=5,y=105) ent_duration.place(x=70,y=105) btn.place(x=70,y=130) ent_replay.insert(tk.END,"5") ent_count.insert(tk.END,"3") ent_high_tone.insert(tk.END,"5") ent_low_tone.insert(tk.END,"3") ent_duration.insert(tk.END,"200") root_window.mainloop()
解説
GUIとビープ音の解説は前回・前々回で説明が終わっているので省略。
今回新登場した要素は、テキストボックスだ。
tk.Entryというクラスで作成することができる。
プログラムで文字を入力するには、insert命令で、最初の引数 tk.END はテキストボックスの最後に挿入するという意味で、2番目の引数が実際に入力する値。
startボタンを押したときにはgetメソッドで内容を取り出して、int関数で整数に直してから変数に格納し、あとはループ中で利用している。
テキストボックスの使い方はこちらのサイトが分かりやすいのでご参考までに。
pg-chain.com
今回のコードは実際にはかなり冗長なので、次回もう少しスマートにしてみようと思う。