PythonでTkinterを使ってGUIの電卓アプリを作成する方法

スポンサーリンク

今日は、Tkinterを使って簡単なGUI電卓を作る方法を紹介します。

コード全体をステップバイステップで理解していきます。

スポンサーリンク

Tkinterを使ったGUI電卓を始めよう

まず始めに、Python用のTkinterライブラリがインストールされていることを確認してください。

TkinterはPythonプログラミング言語用の標準GUIライブラリです。

 PythonとTkinterを組み合わせると、グラフィカルユーザインタフェースアプリケーションを高速かつ容易に作成することができます

TkinterはTk GUIツールキットに対する強力なオブジェクト指向のインタフェースを提供します。

もしTkinterがpythonにプリインストールされていない場合は、Windowsのcmdを開き、次のコマンドを入力してください。

pip install python-tk

Tkinterを用いたGUI電卓の構造

messagebox.Name_of_the_function(title,message[, options])

Python TkinterのLabelです。

Labelは、テキストや画像を配置するコンテナボックスを指定するために使用されます。

このウィジェットは、Pythonアプリケーションで使用される他のウィジェットに関するメッセージをユーザに提供するために使用されます。

Pythonフレーム フレームはウィジェットの一種です。

Pythonのフレームは、子要素のための単純なコンテナにすぎません。

これを使うと、子コンテナにメインフレームを与えることができ、レイアウト全体をフレームごとに分割することができます

例えば、プログラムを実行すると、最初にラベルがあり、次にルートウィンドウにいくつかのボタンがあるとします。


このルートウィンドウをパーツごとに分割することができます

たとえば、ラベルをひとつのパーツとして、ボタンを別のパーツに分割することができます

これらのパーツを1つのフレームに収めれば、そのフレームが親要素になります。

これは、複雑なデザインを簡素化するのに役立ちます。

フレームを追加した後の電卓の構造は、次のようになります。

  1. ラベル
  2. フレーム1:4ボタン
  3. フレーム2:4ボタン
  4. フレーム3:4ボタン
  5. フレーム4:4ボタン

Pythonのボタン ボタンウィジェットは、Pythonアプリケーションにボタンを追加するために使用されます。

これらのボタンは、ボタンの目的を伝えるテキストや画像を表示することができます


ボタンをクリックしたときに自動的に呼び出される関数やメソッドをボタンにアタッチすることができます


1. 関数の定義

ここでは、ボタンのコーディング部分から始めます。

val=""
A = 0
operator=""
 
def btn_1_isclicked():
    global val
    #Concatinate string value 1 with the val and store it in the variable val again
    val = val + "1"
    data.set(val)

まず、btn_1_isclicked()という関数を定義します。

この関数を見ただけで何をやっているのかがわかるように、凝った名前をつけています。

ここでは、数字ボタンをクリックしたときに、その数字をラベルに表示し、それを別の変数に格納して計算しやすくしています。

変数名の問題を回避するために、グローバルに変数を受け入れることにします。

Pythonでは、関数の外やグローバルスコープで宣言された変数をグローバル変数と呼びます。

つまり、グローバル変数は関数の内側でも外側でもアクセスすることができます

ここでいうvalはグローバル変数です。

上記のコードでは、val をグローバル変数として作成し、グローバル変数 val を表示し、その値を保存する btn_1_isclicked( ) を定義しています。

すべてのTkinterボタンについて、同じ手順を踏んでください。

#import the necessary libraries
import tkinter
from tkinter import *
from tkinter import messagebox
 
val=""
A = 0
operator=""
 
def btn_1_isclicked():
    global val
    val = val + "1"
    data.set(val)
 
def btn_2_isclicked():
    global val
    val = val + "2"
    data.set(val)
 
def btn_3_isclicked():
    global val
    val = val + "3"
    data.set(val)
 
def btn_4_isclicked():
    global val
    val = val + "4"
    data.set(val)
 
def btn_5_isclicked():
    global val
    val = val + "5"
    data.set(val)
 
def btn_6_isclicked():
    global val
    val = val + "6"
    data.set(val)
 
def btn_7_isclicked():
    global val
    val = val + "7"
    data.set(val)
 
def btn_8_isclicked():
    global val
    val = val + "8"
    data.set(val)
 
def btn_9_isclicked():
    global val
    val = val + "9"
    data.set(val)
 
def btn_0_isclicked():
    global val
    val = val + "0"
    data.set(val)
 
def btn_add_clicked():
    global A
    global operator
    global val
    A = int(val)
    operator = "+"
    val = val + "+"
    data.set(val)
 
def btn_sub_clicked():
    global A
    global operator
    global val
    A = int(val)
    operator = "-"
    val = val + "-"
    data.set(val)
 
def btn_mul_clicked():
    global A
    global operator
    global val
    A = int(val)
    operator = "*"
    val = val + "*"
    data.set(val)
 
def btn_div_clicked():
    global A
    global operator
    global val
    A = int(val)
    operator = "/"
    val = val + "/"
    data.set(val)
 
def btn_equal_clicked():
    global A
    global operator
    global val
    A = int(val)
    operator = "="
    val = val + "="
    data.set(val)
 
def C_pressed():
    global A
    global operator
    global val
    val = ""
    A=0
    operator=""
    data.set(val)
 
 
def result():
    global A
    global operator
    global val
    val2 = val
    if operator == "+":
        x=int((val2.split("+")[1]))
        c = A + x
        data.set(c)
        val=str(c)
    elif operator == "-":
        x=int((val2.split("-")[1]))
        c = A - x
        data.set(c)
        val=str(c)
    elif operator == "*":
        x=int((val2.split("*")[1]))
        c = A * x
        data.set(c)
        val=str(c)
    elif operator == "/":
        x=int((val2.split("/")[1]))
        if x==0:
            messagebox.show("Error","Division by 0 Not Allowed")
            A==""
            val=""
            data.set(val)
        else:
            c=int(A/x)
            data.set(c)
            val=str(c)

2. Tkinterを使ったGUI電卓のウィンドウの作成

tkinterを初期化するために、Tkのルートウィジェット(ウィンドウマネージャが提供するタイトルバーやその他の装飾を持つウィンドウ)を作成する必要があります。

ルートウィンドウは私たちのプログラムにおけるメインアプリケーションウィンドウです。

タイトルバーと枠線があります。

これらはウィンドウマネージャによって提供されます。


他のウィジェットの前に作成する必要があります。

geometry` メソッドはウィンドウの大きさを設定し、スクリーン上に配置します。

最初の2つのパラメータはウィンドウの幅と高さです。

最後の2つのパラメータは、xとyのスクリーン座標です。

root.resizableを(0,0)に設定すると、プログラマーはウィンドウのサイズを変更することができません。

root.resizable(0,0)を使用すると、電卓が正しく配置されるようになります。

#create a root window
root = tkinter.Tk()
#set geometry
root.geometry("250x400+300+300")
#disable the resize option for better UI
root.resizable(0,0)
#Give the tiltle to your calculator window
root.title("Python-Cal")

3. ラベルの書式を設定する

ラベルは、テキストや画像を配置することができる表示ボックスです。

このウィジェットで表示されるテキストは、いつでも好きなタイミングで更新することができます

また、テキストの一部に下線を引いたり(キーボードショートカットを識別するような)、テキストを複数行にまたがったりすることも可能です。

ラベルの親はルートです。

つまり、1つのフレームに限定されるのではなく、ルート・ウィンドウ全体が対象となります。

次に、単純なテキストを置きます。

このテキストは、クリックしたボタンの数がラベルに表示されるまで、コード全体で少しずつ変化させていきます。

Tkinter StringVar は、ラベルやエントリのようなウィジェットの値をより効果的に管理するのに役立ちます。

コンテナとは、StringVar オブジェクトが関連付けられたウィジェットのことです。

コンテナを省略した場合は、ルートウィンドウがデフォルトとなり、value は初期値で、デフォルトは空文字列となります。

anchorです。

これは、ウィジェットがテキストが必要とする以上のスペースを持っている場合、テキストがどこに配置されるかを制御します。

デフォルトはanchor=SE(ウィジェットはフレームの右下隅に配置されます)です。

textvariable : エントリウィジェットから現在のテキストを取得できるようにするには、このオプションにStringVarクラスのインスタンス、すなわち、データ

#Label
data= StringVar()
lbl=Label(
    root,
    text="Label",
    anchor=SE,
    font=("Verdana",20),
    textvariable=data,
    background="#ffffff",
    fg="#000000",
)
#expand option deals with the expansion of parent widget.
lbl.pack(expand=True,fill="both",)

4. ウィンドウにボタンを配置する

フレームは python のウィジェットです。

他のウィジェットをグループ化したり、整理したりする処理にとても重要です。

これはコンテナのように動作し、他のウィジェットの位置を整理する役割を果たします。

レイアウトを整理し、ウィジェットのパディングを提供するために、画面内の長方形の領域を使用します。

また、フレームは複雑なウィジェットを実装するための基礎クラスとして使用することもできます。

ここでは、名声のための変数名をbtnrow1としています。

フレームの構文は次のとおりです。

variable_name=Frame(parent_window,options..)
  • Parent_window – rootは、親ウィンドウを表します。
  • オプション – このコードで最もよく使用されるオプションのリストです。これらのオプションは、カンマで区切られたキーと値のペアで使用できます。
  • bg: bg: ラベルとインジケーターの後ろに表示される通常の背景色です。

そして、フレームをパックします。

他の3つのフレームについても、ルートウィンドウを呼び出して、同じ手順を繰り返します。

#Frame Coding for Buttons
#Frame for root window
#Frame 1
btnrow1=Frame(root,bg="#000000")
#If frame gets some space it can expand
btnrow1.pack(expand=True,fill="both",)
 
#Frame 2
btnrow2=Frame(root)
btnrow2.pack(expand=True,fill="both",)
 
#Frame 3
btnrow3=Frame(root)
btnrow3.pack(expand=True,fill="both",)
 
#Frame 4
btnrow4=Frame(root)
btnrow4.pack(expand=True,fill="both",)

5. Tkinterを使ったGUI電卓へのボタンの追加

ボタンウィジェットは、PythonのTkinterライブラリを使ってGUI電卓にボタンを追加するために使用されます。

これらのボタンは、ボタンの目的を伝えるためのテキストや画像を表示することができます


ボタンをクリックしたときに自動的に呼び出される関数やメソッドをボタンにアタッチすることができます

relief : デフォルトではrelief=GROOVEとなっています。

このオプションは、他のスタイルに設定することもできます。

sunken、rigid、raised、flat など。

commandは、ボタンがクリックされたときに呼び出される関数またはメソッドです。

ここでは、タスクを実行するために、先に作成した関数であるcommand = btn_1httpdを呼び出します。

他のボタンも同じ方法で呼び出します。

#Button row One
#Button 1
btn1=Button(
    btnrow1,
    text = "1",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_1_isclicked,
)
#Buttons will be side by side
btn1.pack(side=LEFT,expand=True,fill="both",)
 
#Button 2
btn2=Button(
    btnrow1,
    text = "2",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_2_isclicked,
)
#Buttons will be side by side
btn2.pack(side=LEFT,expand=True,fill="both",)
 
#Button 3
btn3=Button(
    btnrow1,
    text = "3",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_3_isclicked,
)
#Buttons will be side by side
btn3.pack(side=LEFT,expand=True,fill="both",)
 
#Button add
btnadd=Button(
    btnrow1,
    text = "+",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_add_clicked,
)
#Buttons will be side by side
btnadd.pack(side=LEFT,expand=True,fill="both",)
 
#Button row Two
#Button 4
btn4=Button(
    btnrow2,
    text = "4",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_4_isclicked,
)
#Buttons will be side by side
btn4.pack(side=LEFT,expand=True,fill="both",)
 
#Button 5
btn5=Button(
    btnrow2,
    text = "5",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_5_isclicked,
)
#Buttons will be side by side
btn5.pack(side=LEFT,expand=True,fill="both",)
 
#Button 6
btn6=Button(
    btnrow2,
    text = "6",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_6_isclicked,
)
#Buttons will be side by side
btn6.pack(side=LEFT,expand=True,fill="both",)
 
#Button Subtraction
btnsub=Button(
    btnrow2,
    text = "-",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_sub_clicked,
)
#Buttons will be side by side
btnsub.pack(side=LEFT,expand=True,fill="both",)
 
#Button row Three
#Button 7
btn7=Button(
    btnrow3,
    text = "7",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_7_isclicked,
)
#Buttons will be side by side
btn7.pack(side=LEFT,expand=True,fill="both",)
 
#Button 8
btn8=Button(
    btnrow3,
    text = "8",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_8_isclicked,
)
#Buttons will be side by side
btn8.pack(side=LEFT,expand=True,fill="both",)
 
#Button 9
btn9=Button(
    btnrow3,
    text = "9",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_9_isclicked,
)
#Buttons will be side by side
btn9.pack(side=LEFT,expand=True,fill="both",)
 
#Button Multiply
btnmul=Button(
    btnrow3,
    text = "*",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_mul_clicked,
)
#Buttons will be side by side
btnmul.pack(side=LEFT,expand=True,fill="both",)
 
#Button row Four
#Button C
btnC=Button(
    btnrow4,
    text = "C",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = C_pressed,
)
#Buttons will be side by side
btnC.pack(side=LEFT,expand=True,fill="both",)
 
#Button 0
btn0=Button(
    btnrow4,
    text = "0",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_0_isclicked,
)
#Buttons will be side by side
btn0.pack(side=LEFT,expand=True,fill="both",)
 
#Button Equal to
btnequal=Button(
    btnrow4,
    text = "=",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command=result,
)
#Buttons will be side by side
btnequal.pack(side=LEFT,expand=True,fill="both",)
 
#Button Divide
btndiv=Button(
    btnrow4,
    text = "/",
    font = ("Verdana",22),
    relief =GROOVE,
    border=0,
    command = btn_div_clicked,
     
)
#Buttons will be side by side
btndiv.pack(side=LEFT,expand=True,fill="both",)
 
 
root.mainloop()

最後に、mainloopに入る。

ここからがイベント処理の始まりです。

メインループは、ウィンドウシステムからイベントを受け取り、アプリケーションウィジェットにディスパッチします。

タイトルバーのクローズボタンをクリックするか、quit() メソッドを呼び出すと、メインループは終了します。

Calculator

まとめ

この記事では、Tkinterのボタン、フレーム、ラベルとその機能、Tkinterのウィンドウ、入力ボックス、およびこれらを組み合わせてGUIアプリケーションを構築する方法について説明しました。

コードを理解することで、tkinterライブラリとそのウィジェットを使ったGUI電卓を構築することに成功しました。

この記事がお役に立てれば幸いです。

ありがとうございました。

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