1. 程式人生 > >用面向物件方法實現簡易計算器

用面向物件方法實現簡易計算器

#計算器 面向物件寫法
import tkinter

class jsq:
    #初始魔術方法
    def __init__(self):
        self.a = False
        self.root = tkinter.Tk()
        self.root.title('BUG版1.0')
        self.root.minsize(360, 500)

        # 為lable設定一個變數
        self.shownum = tkinter.StringVar()
        self.shownum.set(0)

        # 宣告一個用於儲存運算過程的容器
        self.operatelist = []

        # 宣告一個是否按下運算子號的變數
        self.ispresssign = False

        #呼叫設定介面的方法
        self.setwindow()
        self.root.mainloop()


        self.oldnum = 0



    #介面佈局方法
    def setwindow(self):
        # 顯示結果和操作區域
        label = tkinter.Label(self.root, textvariable = self.shownum, bg='cyan', font=('宋體', 30), anchor='se')
        label.place(x=10, y=10, width=340, height=130)

        # 數字按鈕
        btn0 = tkinter.Button(text='0', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('0'))
        btn0.place(x=10, y=430, width=130, height=60)
        btn1 = tkinter.Button(text='1', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('1'))
        btn1.place(x=10, y=360, width=60, height=60)
        btn2 = tkinter.Button(text='2', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('2'))
        btn2.place(x=80, y=360, width=60, height=60)
        btn3 = tkinter.Button(text='3', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('3'))
        btn3.place(x=150, y=360, width=60, height=60)
        btn4 = tkinter.Button(text='4', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('4'))
        btn4.place(x=10, y=290, width=60, height=60)
        btn5 = tkinter.Button(text='5', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('5'))
        btn5.place(x=80, y=290, width=60, height=60)
        btn6 = tkinter.Button(text='6', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('6'))
        btn6.place(x=150, y=290, width=60, height=60)
        btn7 = tkinter.Button(text='7', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('7'))
        btn7.place(x=10, y=220, width=60, height=60)
        btn8 = tkinter.Button(text='8', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('8'))
        btn8.place(x=80, y=220, width=60, height=60)
        btn9 = tkinter.Button(text='9', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('9'))
        btn9.place(x=150, y=220, width=60, height=60)
        btndian = tkinter.Button(text='.', font=('宋體', 18, 'bold'), command = self.dian)
        btndian.place(x=150, y=430, width=60, height=60)
        btnjia = tkinter.Button(text='+', font=('宋體', 18, 'bold'), command=lambda: self.presssign('+'))
        btnjia.place(x=220, y=430, width=60, height=60)
        btnjian = tkinter.Button(text='-', font=('宋體', 18, 'bold'), command=lambda: self.presssign('-'))
        btnjian.place(x=220, y=360, width=60, height=60)
        btncheng = tkinter.Button(text='*', font=('宋體', 18, 'bold'), command=lambda: self.presssign('*'))
        btncheng.place(x=220, y=290, width=60, height=60)
        btnchu = tkinter.Button(text='/', font=('宋體', 18, 'bold'), command=lambda: self.presssign('/'))
        btnchu.place(x=220, y=220, width=60, height=60)
        btnback = tkinter.Button(text='←', font=('宋體', 18, 'bold'), command = self.backspace)
        btnback.place(x=10, y=150, width=60, height=60)
        btnC = tkinter.Button(text='C', font=('宋體', 18, 'bold'), command = self.clear)
        btnC.place(x=80, y=150, width=130, height=60)
        btnzhengfu = tkinter.Button(text='+/-', font=('宋體', 18, 'bold'), command=lambda: self.pressnum('+/-'))
        btnzhengfu.place(x=220, y=150, width=60, height=60)
        btndengyu = tkinter.Button(text='=', font=('宋體', 30, 'bold'), command = self.pressequal)
        btndengyu.place(x=290, y=150, width=60, height=340)

    # 按下數字的函式
    def pressnum(self,num):
        if self.a == True:
            self.shownum.set(num)
            self.a = False
            return

        # 判斷是否按下運算的符號
        if self.ispresssign == True:
            # 將數字歸0
            self.shownum.set('0')
            # 重置運算標誌
            self.ispresssign = False

        # 獲取面板中原有的數字
        self.oldnum = self.shownum.get()
        # 判斷原數字是否為0
        if self.oldnum == '0':  # 如果是0 直接顯示當前按下的數字
            #判斷是否為點
            if num == '.':
                self.shownum.set('0.')
            else:
                self.shownum.set(num)
        else:  # 如果不是0 則需要將原數字和當前按下的數字拼合
            # 判斷是否按下正負號
            if num == '+/-':
                if self.oldnum.startswith('-'):
                    self.shownum.set(self.oldnum[1:])
                else:
                    self.shownum.set('-' + self.oldnum)
            else:
                self.shownum.set(self.oldnum + num)

    # 按下運算的函式
    def presssign(self,sign):
        #判斷是否按下運算子號
        if self.ispresssign == True:
            return
        # 獲取介面中原有的數字
        oldnum = self.shownum.get()
        # 將介面中原有的數字儲存到列表中  準備寫新的內容
        self.operatelist.append(oldnum)
        # 儲存運算子號
        self.operatelist.append(sign)
        # 設定按下運算的標誌
        self.ispresssign = True
        print(self.operatelist)


    # 按下等號的函式
    def pressequal(self):
        try:# 獲取介面中的數字
            oldnum = self.shownum.get()
            # 根列表中的運算組合到一起
            self.operatelist.append(oldnum)
            print(self.operatelist)
            # 運算
            # 將列表中的步驟組合成字串使用eavl運算
            result = eval(''.join(self.operatelist))
            print(result)
            # 顯示結果
            self.shownum.set(result)
            self.a = 1
            # 清空運算類表
            self.operatelist.clear()
        except ZeroDivisionError:
            self.shownum.set('好好學習')

    # 清空操作
    def clear(self):
        # 獲取列表返回0
        operatelist = []
        self.shownum.set('0')
    # backspace
    def backspace(self):
        # 判斷顯示的值為多少
        # 如果為0或空返回0
        if self.shownum.get() == '' or self.shownum.get() == '0':
            self.shownum.set('0')
            return
        else:
            # 獲取得到數值的長度
            num = len(self.shownum.get())
            # 如果長度大於1,去掉最後一位
            if num > 1:
                strnum = self.shownum.get()
                strnum = strnum[0:num - 1]
                self.shownum.set(strnum)
            # 如果長度小於等於1,輸出0
            else:
                self.shownum.set('0')

    def dian(self):
        if '.' in self.oldnum:
            pass
        else:
            a = self.shownum.get()
            self.shownum.set(a + '.')


j = jsq()