SLP Advent Calendar 2024 - Adventar
本記事は21日目になります。
まえがき
こんにちは。kakkoです。
今回は、GUIをつくりたいと思い、ボタンを押す操作を使って簡単なゲームをつくりました。ゲーム名は「10カウントチャレンジ」です。
どんなゲームかというと、ボタンを長押しすると数字がカウントアップするので、数字がぴったし10になるタイミングでボタンを離そう!というゲームです。つまりは、10秒チャレンジみたいなものです。
今回、GUIの作成にはtkinterを使いました。
tkinterとは
tkinterはPythonの標準モジュールであり、それを使うことで簡単にGUIを作成することができます。
tkinterでのGUI画面の作成は、基本的に以下の3つの手順に沿って行うことができます。
- ウィンドウの作成
- フレームの設定・配置
- ウェジェットの設定・配置
フレームとは、ウェジェットを入れる箱のことです。
ウェジェットとは、ボタンやラベルなどのオブジェクトのことです。
「10カウントチャレンジ」の概要
スタート画面は以下のようになります。
このゲームの動作は次のような流れになります。
- 「カウント」ボタンを長押しする
- 「0.00」のカウントが0.01ずつ増える
- 数字が5.0になると表示が「----」となり、数字が見えなくなる
- 10カウントになったと思ったらボタンを離す
- 「けっか」ボタンを押して結果を表示する
ソースコードについて
tkinterのインポート
まず、tkinterをインポートします。
以下のコードでtkinterをインポートすることができます。
import tkinter as tk
つづいて、tkinterでのGUI画面の作成の手順に沿ってソースコードを書いていきます。
ウィンドウの作成
ウィンドウの作成と設定のコードは以下のようになります。
root = tk.Tk()
# ウィンドウ作成
root.title('10カウントチャレンジ')
root.geometry('300x300')
root.resizable(False, False)
#ここに他のコードを書いていく
root.mainloop()
root
というメインウィンドウを作成し、ウィンドウのタイトル、サイズの設定とサイズ変更ができないように設定しています。
そして、root.mainloop()
でイベントループを開始して、ユーザからの要求を処理します。
フレームの設定・配置
フレームの設定と配置は以下のようになります。
このソースコードはウィンドウ作成のコードとroot.mainloop()
の間に記述します。
# フレームの設定
frame1 = tk.Frame(root, width=300, height=200, bd=5, relief='solid')
frame2 = tk.Frame(root, width=300, height=100, bd=5, relief='solid')
# Frameサイズを固定
frame1.grid_propagate(False)
frame2.grid_propagate(False)
# フレーム設置
frame1.grid(row=0, column=0)
frame2.grid(row=1, column=0)
ウェジェットの設定
今回は、ウェジェットとして、ラベルとボタンを使っています。
このコードはフレームの設定・配置のコードとroot.mainloop()
の間に記述します。
ラベルの設定
ラベルは、文字を表示するためのウェジェットです。
今回、コメントを表示するラベルと数字を表示するラベルの2つを設定しています。
コメントのラベル
コメントを表示するラベルは以下のように設定します。
# コメントのラベル
cmnt_text = tk.StringVar()
cmnt_text.set('10カウントぴったりで\nボタンを離そう!')
cmnt_label = tk.Label(frame1, textvariable=cmnt_text, font=('MS UI Gothic', 20))
このラベルは「10カウントぴったりでボタンを離そう!」という文字の部分を設定しています。
コメントのラベルは、tk.Label(ラベルを設置するフレーム, テキストの設定, フォントの設定)
をしています。
数字のラベル
数字を表示するラベルは以下のように設定します。
# カウンタ設定
cnt = 0.00
# 数字の表示
text = tk.StringVar()
text.set(f"{cnt:.2f}")
label = tk.Label(frame1, textvariable=text, font=('MS UI Gothic', 40))
数字のラベルはスタート画面における「0.00」の部分になります。
数字はカウントされるのでその管理をcnt
で行います。cnt
は0.01ずつ増えるので数字を小数点第2位まで表示させるようにテキストの設定をtext.set(f"{cnt:.2f}")
としています。
ラベルの設定はテキストのラベルと同じです。
ボタンの設定
ボタンとは、クリック時の動作を設定できるウェジェットです。
今回、長押しで数字をカウントする「カウント」ボタンと結果を表示する「けっか」ボタンの2つを設定しています。
「カウント」ボタンの設定
「カウント」ボタンの設定は以下のようになります。
# 「カウント」ボタンの設定
button = tk.Button(frame2, text='カウント', command=btn_click, repeatdelay=8, repeatinterval=10)
ボタンの設定では、基本的に、ボタンを配置するフレーム、ボタンの文字、ボタンを押したときに実行される関数を設定します。
このボタンは、長押しをするボタンなので、長押しができるオプションのrepeatdelay
とrepeatinterval
を使っています。
repeatdelay
は長押しとして判定する秒数を設定しています。そして、repeatinterval
はイベント処理の動作間隔の秒数をミリ秒で設定します。
今回の場合では、ボタンを8ミリ秒以上長押しするとbtn_click
関数が動作して、そのあと長押しを続けると10ミリ秒間隔で関数が動作します。
ここで、btn_click
関数は以下のようになります。
# クリック時に動作させる関数
def btn_click():
global cnt
cnt += 0.01
if(cnt <= 5):
text.set(f"{cnt:.2f}")
else:
text.set('----')
btn_click
関数では、cnt
に0.01を足して、それを数字を表示するラベルのテキストに設定します。そして、cnt
が5以上になると「----」をテキストに設定することで、5カウントしたあとは、数字が見えなくなるようにしています。
「けっか」ボタンの設定
「けっか」ボタンの設定は以下のようになります。
# 「けっか」のボタン設定
re_button = tk.Button(frame2, text='けっか', command=result)
このボタンでは、ボタンの基本的な設定をしていて、押したらresult
関数が動作します。
result
関数は以下のようになります。
# 結果を表示する関数
def result():
text.set(f"{cnt:.2f}")
if(cnt > 11):
cmnt_text.set('おそい!')
elif(cnt > 10):
cmnt_text.set('おしい!')
elif(cnt == 10):
cmnt_text.set('おめでとう!!')
elif(cnt >= 9):
cmnt_text.set('おしい!')
else:
cmnt_text.set('はやい!')
数字を表示するラベルのテキストをcnt
として、数字が表示されるようにします。
そして、cnt
の値によってコメントのラベルのテキストを変更して、コメントが変化するようにしています。10カウントぴったりだった時は「おめでとう!!」、10から±1の時は「おしい!」、それ以上の時は「おそい!」や「はやい!」というコメントを表示するようにしています。
ウェジェットの配置
ウェジェットの配置は以下のようになります。
# フレーム設置
frame1.grid(row=0, column=0)
frame2.grid(row=1, column=0)
# ラベル配置
cmnt_label.grid(row=0, column=0)
label.grid(row=1, column=0)
# ボタンを配置
button.grid(row=0, column=0)
re_button.grid(row=0, column=1)
grid
というメソッドを使ってウェジェットを配置しています。
row
、column
は格子状の縦方向の座標、横方向の座標を表しています。row
は縦方向を表していて、下に行くほど数字が大きくなります。column
は横方向を表していて、右に行くほど数字が大きくなります。row
はy軸、column
はx軸と考えてみると分かりやすいかもしれません。
おわりに
今回はtkinterを使ってGUIを作成しました。
本記事では、ウェジェットとして、ボタンとラベルのみを使用しましたが、tkinterには、他にもチェックボックスやテキストボックスなどいろいろなウェジェットがあります。
GUIの作成に興味のある人はぜひtkinterを使って見てはいかがでしょうか?
最後まで読んでいただきありがとうございました。