from tkinter import *
from tkinter import ttk
LAYOUT = [
['7','8','9','/'],
['4','5','6','*'],
['1','2','3','-'],
['0','C','=','+'],
]
#記号をまとめた定数
CAL = ('+','-','*','/','**','//')
class dentakuApp(ttk.Frame):
"""電卓アプリ(予定)."""
def __init__(self,master = None):
super().__init__(master)
self.exp_list = ['0']
self.create_style()
self.create_widgets()
def create_style(self):
"""ボタン、ラベルのスタイルを変更"""
style = ttk.Style()
#ラベルのスタイルを上書き
style.configure(
'TLabel', font=('Helvetica',20),
background = 'black', foreground = 'white',
)
def create_widgets(self):
"""ウィジェットの作成"""
self.display_var = StringVar()
self.display_var.set('0') #初期値を0にする
#計算結果の表示ラベル
display_label = ttk.Label(self, textvariable = self.display_var)
display_label.grid(column = 0, row = 0, columnspan = 4, sticky = (N,S,E,W))
#レイアウト作成
for y,row in enumerate(LAYOUT, 1):
for x, char in enumerate(row):
button = ttk.Button(self, text = char)
button.grid(column = x, row = y, sticky = (N,S,E,W))
button.bind('<Button-1>',self.calc)
self.grid(column = 0, row = 0, sticky = (N,S,E,W))
#横の引き伸ばし
self.columnconfigure(0, weight = 1)
self.columnconfigure(1, weight = 1)
self.columnconfigure(2, weight = 1)
self.columnconfigure(3, weight = 1)
#縦の引き伸ばし 0番目の結果表示欄だけ元の大きさのまま
self.rowconfigure(0, weight = 0)
self.rowconfigure(1, weight = 1)
self.rowconfigure(2, weight = 1)
self.rowconfigure(3, weight = 1)
self.rowconfigure(4, weight = 1)
#ウインドウ自体の引き伸ばし設定
self.master.columnconfigure(0, weight = 1)
self.master.rowconfigure(0, weight = 1)
def calc(self,event):
char = event.widget['text'] #押されたウィジェットのテキスト部分を取得
#最後に押したボタンの内容
last = self.exp_list[-1]
#ボタンの場合
if char == '=':
if last in CAL:
self.exp_list.pop()
exp = eval(''.join(self.exp_list))
self.exp_list = [str(exp)]
#Cボタンクリア
elif char == 'C':
self.exp_list = ['0']
# 記号を押した場合
elif char in CAL:
if last == char == '/':
self.exp_list[-1] += '/'
elif last == char == '*':
self.exp_list[-1] += '*'
elif last in CAL:
self.exp_list[-1] = char
else:
self.exp_list.append(char)
#それ以外、数字を押した場合
else:
if last == '0':
self.exp_list[-1] = char
elif last in CAL:
self.exp_list.append(char)
else:
self.exp_list[-1] += char
#リストに格納している式を文字列にして画面に反映
self.display_var.set(
''.join(self.exp_list)
)
def main():
gamen = Tk()
gamen.title('簡単電卓')
dentakuApp(gamen)
gamen.mainloop()
if name == 'main':
main()