Python

PythonでGUIを作ってみる

概要

今回は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の他のライブラリとの連携も楽だと思うので覚えていきたいです。

Y.N
GRIでデータ分析やアルゴリズム開発、ForecastFlowの開発に携わっています。