概要
今回はtkinterというPythonで利用できるGUIを構築するための標準ライブラリを使いました。
機械学習やデータの加工だけでなくPythonでもGUIを構築することができ、そのための機能が標準で備わっているというわけです。
今回はtkinterを触ってみたかったので簡単にじゃんけんができるGUIアプリケーションを作ってみました。
環境
今回はPython3.8.12を使用しました。
コード
詳細な説明は省略します。
Buttonを押すとupdate関数が実行されて勝敗が表示される仕様です。
import tkinter
from enum import Enum
from functools import partial
from random import randint
class Game: # じゃんけんの状態を管理するクラス
def __init__(self) -> None:
self.player_hand = Hand(0)
self.cpu_hand = Hand(0)
def select(self, hand: "Hand") -> None:
"""プレイヤーの手の決定"""
self.player_hand = hand
self._cpu_select()
def _cpu_select(self) -> None:
"""コンピュータの手"""
i = randint(0, 2)
self.cpu_hand = Hand(i)
@property
def result(self) -> str:
"""じゃんけんの結果"""
if (self.player_hand.value + 1) % 3 == self.cpu_hand.value:
return "勝ち!!"
elif self.player_hand == self.cpu_hand:
return "あいこ"
else:
return "負け..."
class Hand(Enum): # じゃんけんの手
ROCK = 0
SCISSORS = 1
PAPER = 2
HAND_STRS = ["グー", "チョキ", "パー"] # ボタンのテキスト
game = Game()
root = tkinter.Tk()
root.title("じゃんけん")
root.geometry("400x300")
# ラベル
desc_label = tkinter.Label(root, text="じゃんけんぽん!!")
desc_label.grid(row=0, column=0, columnspan=3)
result_str = tkinter.StringVar()
result_str.set("---")
result_label = tkinter.Label(root, textvariable=result_str)
def update(_: "tkinter.Event", hand: "Hand"):
game.select(hand)
result_str.set(game.result)
for hand in Hand:
hand_num = hand.value
button = tkinter.Button(root, text=HAND_STRS[hand_num], width=5, height=2)
button.bind(f"<1>", func=partial(update, hand=hand)) # 左クリック # ボタンを押したときに実行される関数
button.grid(row=1, column=hand_num)
result_label.grid(row=2, column=0, columnspan=3)
root.mainloop()
実行
起動直後の画面です。
グーチョキパーのどれかを左クリックすると、勝敗が表示されます。
終わりに
今回はtkinterの利用が始めてだったので簡単なアプリを作成しました。
tkinterであればPythonの他のライブラリとの連携も楽だと思うので覚えていきたいです。