用面向物件方法實現簡易計算器
阿新 • • 發佈:2019-01-01
#計算器 面向物件寫法 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()