少し大きめの修正をしてみました。
=
を押したときに 加算処理 あるいは 除算処理 をするので、それらの計算関数を変数に記憶しておいて、=
が押されたときに記憶した計算関数を呼び出すようにしました。
いちいち global を書くのが面倒なので、class number をデータ領域にしました。こうすれば global を書かなくて済みます。
import tkinter as tk
class number:
"""2項演算のモデル"""
# 入力中の数字
current = 0
# 第一項
first = 0
# 第二項
second = None
# 演算子
op = None
def op_plus(a, b):
return a + b
def op_division(a, b):
return a / b
def digit(n):
number.current = number.current * 10 + n
if number.op is None:
number.first = number.current
else:
number.second = number.current
show_number(number.current)
def clear():
number.current = 0
number.first = 0
number.second = None
number.op = None
show_number(number.current)
def calculate():
if number.second is not None:
number.first = number.op(number.first, number.second)
number.second = None
number.current = 0
number.op = None
show_number(number.first)
def plus():
calculate()
number.op = op_plus
def division():
calculate()
number.op = op_division
def eq():
calculate()
def show_number(num):
e.delete(0, tk.END)
e.insert(0, str(num))
# tkinter での画面の構成
root = tk.Tk()
f = tk.Frame(root)
f.grid()
# ウィジェットの作成
b1 = tk.Button(f, text='1', command=lambda: digit(1))
b2 = tk.Button(f, text='2', command=lambda: digit(2))
b3 = tk.Button(f, text='3', command=lambda: digit(3))
b4 = tk.Button(f, text='4', command=lambda: digit(4))
b5 = tk.Button(f, text='5', command=lambda: digit(5))
b6 = tk.Button(f, text='6', command=lambda: digit(6))
b7 = tk.Button(f, text='7', command=lambda: digit(7))
b8 = tk.Button(f, text='8', command=lambda: digit(8))
b9 = tk.Button(f, text='9', command=lambda: digit(9))
b0 = tk.Button(f, text='0', command=lambda: digit(0))
bc = tk.Button(f, text='C', command=clear)
bp = tk.Button(f, text='+', command=plus)
bd = tk.Button(f, text='/', command=division)
be = tk.Button(f, text="=", command=eq)
# Grid 型ジオメトリマネージャによるウィジェットの
# 割付
b1.grid(row=3, column=0)
b2.grid(row=3, column=1)
b3.grid(row=3, column=2)
b4.grid(row=2, column=0)
b5.grid(row=2, column=1)
b6.grid(row=2, column=2)
b7.grid(row=1, column=0)
b8.grid(row=1, column=1)
b9.grid(row=1, column=2)
b0.grid(row=4, column=0)
bc.grid(row=1, column=3)
be.grid(row=4, column=3)
bp.grid(row=2, column=3)
bd.grid(row=3, column=3)
# 数値を表示するウィジェット
e = tk.Entry(f)
e.grid(row=0, column=0, columnspan=4)
clear()
# ここからGUIがスタート
root.mainloop()