電卓 version 1

2018/10/01 14:08 by python0705
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
電卓


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()
        

        
      

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()