--- Title: 電卓 Author: python0705 Web: https://mimemo.io/m/kEWpAokZ9vG7Jaj --- 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('',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()