Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonとTkinterで作る!初心者向けシンプルGUI計算機の作り方

このチュートリアルでは、Pythonの標準モジュールTkinterを使用して、シンプルなGUI計算機を作成します。TkinterはPythonに組み込まれているGUIアプリケーション開発用のモジュールで、追加インストールが不要で手軽に使えるのが魅力です。GUIアプリケーションを活用すれば、データや計算結果を視覚的にわかりやすく操作できます。

それでは、シンプルなGUI計算機の作り方を見ていきましょう。

作成の手順

  • Tkinterからすべての機能を「*」でインポートします。
  • 計算機のインターフェース(ウィンドウ)を作成します。
  • 入力フィールドに数字を入力する関数(input_number)を作成します。
  • 入力フィールドの内容をすべて消去する関数(clear_input_field)を作成します。
  • 最後に、入力された式を評価して結果を返す関数(evaluate)を作成します。

サンプルコード

# tkinterからすべてをインポート
from tkinter import *

# 全ての関数からアクセスできるようにする式変数
expression = ""


def input_number(number, equation):
    # グローバル変数expressionにアクセス
    global expression
    # 文字列として連結
    expression = expression + str(number)
    equation.set(expression)


def clear_input_field(equation):
    global expression
    expression = ""
    # 入力フィールドに空のメッセージを設定
    equation.set("Enter the expression")


def evaluate(equation):
    global expression
    try:
        # 式の評価を試みる
        result = str(eval(expression))
        # 結果を入力フィールドに表示
        equation.set(result)
        # expressionを空文字列にリセット
        expression = ""
    except:
        # エラーが発生した場合、ユーザーに通知
        equation.set("Enter a valid expression")
        expression = ""


# GUIの作成
def main():
    # メインウィンドウを生成
    window = Tk()
    # ウィンドウのタイトルを設定
    window.title("Calculator")
    # ウィンドウサイズを設定
    window.geometry("325x175")
    # StringVarクラスのインスタンス化
    equation = StringVar()
    # 式を入力するフィールド
    input_field = Entry(window, textvariable=equation)
    input_field.place(height=100)
    # ウィジェットの配置にはgridレイアウトを使用
    input_field.grid(columnspan=4, ipadx=100, ipady=5)
    # プレースホルダーメッセージを設定
    equation.set("Enter the expression")

    # 各ボタンを作成し、それぞれの位置に配置
    _1 = Button(window, text='1', fg='white', bg='black', bd=0,
                command=lambda: input_number(1, equation), height=2, width=7)
    _1.grid(row=2, column=0)
    _2 = Button(window, text='2', fg='white', bg='black', bd=0,
                command=lambda: input_number(2, equation), height=2, width=7)
    _2.grid(row=2, column=1)
    _3 = Button(window, text='3', fg='white', bg='black', bd=0,
                command=lambda: input_number(3, equation), height=2, width=7)
    _3.grid(row=2, column=2)
    _4 = Button(window, text='4', fg='white', bg='black', bd=0,
                command=lambda: input_number(4, equation), height=2, width=7)
    _4.grid(row=3, column=0)
    _5 = Button(window, text='5', fg='white', bg='black', bd=0,
                command=lambda: input_number(5, equation), height=2, width=7)
    _5.grid(row=3, column=1)
    _6 = Button(window, text='6', fg='white', bg='black', bd=0,
                command=lambda: input_number(6, equation), height=2, width=7)
    _6.grid(row=3, column=2)
    _7 = Button(window, text='7', fg='white', bg='black', bd=0,
                command=lambda: input_number(7, equation), height=2, width=7)
    _7.grid(row=4, column=0)
    _8 = Button(window, text='8', fg='white', bg='black', bd=0,
                command=lambda: input_number(8, equation), height=2, width=7)
    _8.grid(row=4, column=1)
    _9 = Button(window, text='9', fg='white', bg='black', bd=0,
                command=lambda: input_number(9, equation), height=2, width=7)
    _9.grid(row=4, column=2)
    _0 = Button(window, text='0', fg='white', bg='black', bd=0,
                command=lambda: input_number(0, equation), height=2, width=7)
    _0.grid(row=5, column=0)
    plus = Button(window, text='+', fg='white', bg='black', bd=0,
                  command=lambda: input_number('+', equation), height=2, width=7)
    plus.grid(row=2, column=3)
    minus = Button(window, text='-', fg='white', bg='black', bd=0,
                   command=lambda: input_number('-', equation), height=2, width=7)
    minus.grid(row=3, column=3)
    multiply = Button(window, text='*', fg='white', bg='black', bd=0,
                      command=lambda: input_number('*', equation), height=2, width=7)
    multiply.grid(row=4, column=3)
    divide = Button(window, text='/', fg='white', bg='black', bd=0,
                    command=lambda: input_number('/', equation), height=2, width=7)
    divide.grid(row=5, column=3)
    equal = Button(window, text='=', fg='white', bg='black', bd=0,
                   command=lambda: evaluate(equation), height=2, width=7)
    equal.grid(row=5, column=2)
    clear = Button(window, text='Clear', fg='white', bg='black', bd=0,
                   command=lambda: clear_input_field(equation), height=2, width=7)
    clear.grid(row=5, column=1)

    # GUIを表示
    window.mainloop()


# プログラムの開始点
if __name__ == '__main__':
    main()

コードのポイント解説

グローバル変数による式の管理

expressionは全関数で共有されるグローバル変数で、ユーザーが入力した式を文字列として保持します。globalキーワードを使うことで、関数内からもこの変数を更新できます。

StringVarとEntryウィジェットの連携

StringVarはTkinterの特殊な変数クラスで、Entryウィジェットと紐付けることで、変数の値が変わると自動的に画面表示も更新されます。これにより、ボタン操作のたびに入力フィールドの内容を簡単に反映できます。

eval()による式の評価と例外処理

eval()関数は文字列として渡された数式を実際に計算します。不正な式が入力された場合に備えてtry-exceptブロックでエラーを捕捉し、「Enter a valid expression」というメッセージを表示することで、プログラムがクラッシュするのを防いでいます。

実行結果

上記のプログラムを実行すると、次のようなシンプルな計算機が起動します。

PythonとTkinterで作る!初心者向けシンプルGUI計算機の作り方

「=」ボタンを押すと、入力された式の計算結果が表示されます。

PythonとTkinterで作る!初心者向けシンプルGUI計算機の作り方

まとめ

このチュートリアルでは、Python標準のTkinterモジュールだけを使って、四則演算が可能なGUI計算機を作成しました。ウィジェットの配置にはgridレイアウトマネージャーを使用し、ボタンの色やサイズも自由にカスタマイズできます。さらに機能を拡張したい場合は、小数点ボタンやパーセント計算、キーボード入力への対応などを追加してみると良い練習になるでしょう。

このチュートリアルについてご不明な点がある場合は、コメント欄でお気軽にお尋ねください。

  1. 【Python】Tkinterで作るカラーゲーム – 30秒で文字の色を当てるGUIゲーム開発

    GUIアプリケーションの開発において、Pythonの標準ライブラリ「Tkinter」は非常に人気が高く、初心者でも扱いやすいツールです。追加のインストール作業なしに使えるため、Tkinterを活用すればシンプルなGUIゲームでも手軽に開発できます。 この記事では、Tkinterを使った「カラーゲーム」の作り方を紹介します。このゲームでは、画面に表示される単語の文字色をプレイヤーが入力し、正解するたびにスコアが1点ずつ加算されます。制限時間は30秒で、使用される色は赤(Red)、青(Blue)、緑(Green)、ピンク(Pink)、黒(Black)、黄(Yellow)、オレンジ(Orange)、

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c