#tkinter で計算機を作成する
import tkinter as tk
#tk.Frameクラスの継承
class Application(tk.Frame):
#初期化メソド。引数としてmaster(後述)が入る
def __init__(self, master=None):
super().__init__(master)
#配置指定はジオメトリを使用する
self.master.geometry()
#タイトルを付ける
self.master.title("Calculation")
#入力部を作成
self.entry=tk.Entry(self.master)
#メニューバーを作成
self.menu_bar=tk.Menu(self.master)
#メニューバーを作成するときは
#self.master.configにmenu=self.menu_barだと伝える必要がある。
self.master.config(menu=self.menu_bar)
#その他、ウィジェットを配置する
self.create_widgets()
#==== command を作成する====
#数字ボタンをおしたらエントリーの最後に渡された引数を入力する
def input(self,action):
self.entry.insert(tk.END,action)
#エントリーをデリートする(始めから終わりまで)
def clear_all(self):
self.entry.delete(0,tk.END)
#一旦エントリーをゲットして、最後の文字を除いた文字列を書き込む
def clear_one(self):
txt=self.entry.get()
self.entry.delete(0,tk.END)
self.entry.insert(0,txt[0:-1])
#計算する
def equals(self):
#文字列をpythonの形で実行する関数eval()を使用する
self.value=eval(self.entry.get().replace("÷","/").replace("x","*"))
self.entry.delete(0,tk.END)
self.entry.insert(0,self.value)
#==== ウィジェットを作成する ====
def create_widgets(self):
#==== メニューバー ====
file_menu=tk.Menu(self.menu_bar)
#メニューバーにExitを追加
file_menu.add_command(label="Exit",command=self.master.destroy) #quitでは動かなかった
#メニューバーのFileの下にfile_menu(今はExitのみ)をカスケード表示
self.menu_bar.add_cascade(label="File",menu=file_menu)
#==== エントリー ====
self.entry.grid(row=0,column=0,columnspan=6, pady=3)
self.entry.focus_set()
#==== ボタン ====
tk.Button(self.master,text="7",width=3,command=lambda:self.input(7)).grid(row=1,column=0)
tk.Button(self.master,text="8",width=3,command=lambda:self.input(8)).grid(row=1,column=1)
tk.Button(self.master,text="9",width=3,command=lambda:self.input(9)).grid(row=1,column=2)
tk.Button(self.master,text="4",width=3,command=lambda:self.input(4)).grid(row=2,column=0)
tk.Button(self.master,text="5",width=3,command=lambda:self.input(5)).grid(row=2,column=1)
tk.Button(self.master,text="6",width=3,command=lambda:self.input(6)).grid(row=2,column=2)
tk.Button(self.master,text="1",width=3,command=lambda:self.input(1)).grid(row=3,column=0)
tk.Button(self.master,text="2",width=3,command=lambda:self.input(2)).grid(row=3,column=1)
tk.Button(self.master,text="3",width=3,command=lambda:self.input(3)).grid(row=3,column=2)
tk.Button(self.master,text="0",width=3,command=lambda:self.input(0)).grid(row=4,column=0)
tk.Button(self.master,text=".",width=3,command=lambda:self.input(".")).grid(row=4,column=1)
tk.Button(self.master,text="÷",width=3,command=lambda:self.input("÷")).grid(row=4,column=2)
tk.Button(self.master,text="x",width=3,command=lambda:self.input("x")).grid(row=1,column=3)
tk.Button(self.master,text="-",width=3,command=lambda:self.input("-")).grid(row=2,column=3)
tk.Button(self.master,text="+",width=3,command=lambda:self.input("+")).grid(row=3,column=3)
tk.Button(self.master,text="%",width=3,command=lambda:self.input("%")).grid(row=4,column=3)
tk.Button(self.master,text="AC",width=3,command=lambda:self.clear_all()).grid(row=1,column=4)
tk.Button(self.master,text="C",width=3,command=lambda:self.clear_one()).grid(row=1,column=5)
tk.Button(self.master,text="=",width=6,command=lambda:self.equals()).grid(row=4,column=4,columnspan=2)
#tkのクラスTk()からrootという<tkinter.Tk object .>を作る。
root = tk.Tk()
#クラスApplication内の初期化メソド引数であるmasterへrootを渡す。
app = Application(master=root)
#GUIを起動させる
app.mainloop()