Python とkinterを使ってGUIのコイントスゲームを自作する方法

スポンサーリンク

この記事では、Python Tkinterを使用して、グラフィカルユーザーインターフェイス(GUI)を備えたコインフリッププログラムをコーディングします。

このチュートリアルは、PythonでGUIベースのプログラムを開発するための優れたモジュールであるTkinterモジュールの基本を教えることを目的としています。

こちらもお読みください。

スポンサーリンク

PythonでコインフリップGUIアプリを実装する Tkinter

TkinterはPythonの標準的なGUIライブラリで、インターフェースベースのアプリケーションを作成するために使用されます。

TkinterとPythonを組み合わせると、GUIベースのアプリケーションを非常に簡単に作ることができます。

1. モジュールのインストール

このプログラムでは、Python NumPy, Pillow, Tkinterのライブラリが必要ですが、これらはpipを使って簡単にダウンロードすることができます

pip install numpy
pip install pillow
pip install tk

2. モジュールのインポート

モジュールをインストールした後は、すべてのモジュールをプログラムにインポートすることで、プログラムのコーディングを開始することができます

import numpy as np
from tkinter import *
from PIL import Image, ImageTk

注意:上記のコードで、「」はモジュールTkinterから全てインポートしていることを意味します。

3. アプリケーションのメインウィンドウを作成する

まず、Tk()オブジェクトを使用してTkinterクラスを初期化し、変数’root’に代入します。

これにより、rootを使用して、Tkinterモジュールのすべてのメソッドにアクセスできるようになります。

2行目のコードでは、出力するGUI画面のWidow Sizeを指定しています。

ここでは、400*400(widthxheight)の値を指定しています。

あとはmainloopメソッドでウィンドウを永続化し、自分から閉じない限りウィンドウは閉じないようにしている。

もし、この行をスキップすると、出力画面は一度だけ表示され、すぐに閉じてしまう。

root = Tk()
root.geometry("500*500")
root.mainloop()

上記のコードを実行すると、下図のようなウィンドウが表示されます。

このようなウィンドウが表示されれば、問題ないので、次に進みましょう。

#load heads image
load = Image.open("heads.jpg")
heads = ImageTk.PhotoImage(load)
 
#load tails image
load = Image.open("tails.jpg")
tails = ImageTk.PhotoImage(load)

4. 画像の読み込み

プログラムの結果に応じて、コインの画像を表示することにします。

表が出た場合はコインの表側を、裏が出た場合はコインの裏側を表示します。

表と裏の両方の画像は、プログラムファイルと同じディレクトリに保存されます。

もし、そうでない場合は、画像ファイル名とその保存場所を指定してください。

b1=Button(root, text="Toss the Coin", font=("Arial", 10), command=tossTheCoin, bg='teal', fg='white', activebackground="lightblue", padx=10, pady=10)
b1.pack()

参考までに、コインの表と裏の画像ファイルを追加しておきます。

  • コインの頭の画像
  • コインの尻尾の画像

5. ボタンを追加する

メインウィンドウの準備ができたので、コインを投げるためのボタンが必要です。

このボタンを押すと、tossTheCoin関数が呼び出されるだけです。

ボタンを作成するには、tkinterのButtonクラスを使います。

tfield = Text(root, width=52, height=5)
tfield.pack()

上記のコードでは、メインウィンドウにToss the Coinというテキストを含むボタンをレンダリングしています。

コマンドでは、関数名を渡します。

注意: メインウィンドウに表示したいすべての要素に対して pack() メソッドを使用しています。

6. 結果用テキストフィールド

さて、コインフリップの結果をテキスト形式で表示するためのテキストフィールドを作成します。

そのためには、次のコードを使用します。

tfield.insert(INSERT, "Click on the Button.. To Flip the Coin and get the result")

このテキストフィールドにテキストを挿入するには、次のように挿入関数を使用します。

tfield.delete("1.0", "end")

さて、結果が変わるたびに、前に挿入したテキストを消去する必要があるので、delete textメソッドをボタンクリックに結びつけます。

np.random.binomial(1,0.5)

7. tossTheCoin()関数の実装

コインを投げるとき、表か裏のどちらかに出る確率は50%です。

この公平性をプログラムにも持たせて、実際のコイン投げのシナリオに近づけたいと思います。

そのために、NumPyモジュールの二項法を利用します。

import numpy as np
from tkinter import *
from PIL import Image, ImageTk
 
 
def coinFlip():
    result = np.random.binomial(1,0.5)
    tfield.delete("1.0", "end")
 
    if(result == 1):
        tfield.insert(INSERT, " It's ————> HEADS")
        i.config(image = heads)
         
    else:
        tfield.insert(INSERT, " It's ————> TAILS")
        i.config(image = tails)
 
root = Tk()
root.title("Python Coin Flip")
 
#load heads image
load = Image.open("head.png")
heads = ImageTk.PhotoImage(load)
 
#load tails image
load = Image.open("tail.png")
tails = ImageTk.PhotoImage(load)
 
i = Label(root, image=heads)
i.pack()
 
root.geometry("500x500")
b1 = Button(root, text="Toss the Coin", font=("Arial", 10), command=coinFlip, bg='teal', fg='white', activebackground="lightblue", padx=10, pady=10)
b1.pack()
 
#Text Field for Result
tfield = Text(root, width=52, height=5)
tfield.pack()
tfield.insert(INSERT, "Click on the Button.. To Flip the Coin and get the result")
 
 
root.mainloop()

これは1か0のどちらかを返します。

そこで、configメソッドを使って、1か0かをチェックし、それに応じて表か裏の画像をレンダリングするif条件文を書けばよいのです。

完全なコードは次のようになります。

Output GUI Screen Tkinter

プログラムの最終的な出力は以下のようになります。

Output For Heads 1
Output For Tails 1

私たちのコードの出力 – コインフリップのボタンをクリックしたとき## おわりに

チュートリアルは以上です。

Python Tkinterを使ったCoin Flip – GUIベースのコードを簡単に、そして手間なく学習できたと思います。

タイトルとURLをコピーしました