Python定做個(gè)屬于自己的計(jì)算器
本文一起來(lái)用Python實(shí)現(xiàn)一個(gè)屬于自己的計(jì)算器,小而美哈!
1 ui設(shè)計(jì)
使用qt designer ,按裝anaconda后,在如下路徑找到:
conda3.05\Library\bin
designer.exe文件,雙擊啟動(dòng):

創(chuàng)建窗體,命名為XiaoDing,整個(gè)的界面如下所示:

qt 設(shè)計(jì)器提供的常用控件基本都能滿足開發(fā)需求,通過(guò)拖動(dòng)左側(cè)的控件,很便捷的就能搭建出如下的UI界面,比傳統(tǒng)的手寫控件代碼要方便很多。
最終設(shè)計(jì)的計(jì)算器XiaoDing界面如下,

比如,其中一個(gè)用于計(jì)算器顯示的對(duì)象:lcdNumber,對(duì)象的類型為:LCD Number。右側(cè)為計(jì)算器中用到的所有對(duì)象。


2 轉(zhuǎn)py文件
使用如下命令,將設(shè)計(jì)好的ui文件轉(zhuǎn)為py文件
pyuic5 -o ./calculator/MainWindow.py ./calculator/mainwindow.ui
3 計(jì)算器實(shí)現(xiàn)邏輯
導(dǎo)入庫(kù):
from?PyQt5.QtGui?import?*
from?PyQt5.QtWidgets?import?*
from?PyQt5.QtCore?import?*
import?operator
from?MainWindow?import?Ui_MainWindow
主題代碼邏輯很精簡(jiǎn):
#?Calculator?state.
READY?=?0
INPUT?=?1
class?MainWindow(QMainWindow,?Ui_MainWindow):
????def?__init__(self,?*args,?**kwargs):
????????super(MainWindow,?self).__init__(*args,?**kwargs)
????????self.setupUi(self)
????????#?Setup?numbers.
????????for?n?in?range(0,?10):
????????????getattr(self,?'pushButton_n%s'?%?n).pressed.connect(lambda?v=n:?self.input_number(v))
????????#?Setup?operations.
????????self.pushButton_add.pressed.connect(lambda:?self.operation(operator.add))
????????self.pushButton_sub.pressed.connect(lambda:?self.operation(operator.sub))
????????self.pushButton_mul.pressed.connect(lambda:?self.operation(operator.mul))
????????self.pushButton_div.pressed.connect(lambda:?self.operation(operator.truediv))??#?operator.div?for?Python2.7
????????self.pushButton_pc.pressed.connect(self.operation_pc)
????????self.pushButton_eq.pressed.connect(self.equals)
????????#?Setup?actions
????????self.actionReset.triggered.connect(self.reset)
????????self.pushButton_ac.pressed.connect(self.reset)
????????self.actionExit.triggered.connect(self.close)
????????self.pushButton_m.pressed.connect(self.memory_store)
????????self.pushButton_mr.pressed.connect(self.memory_recall)
????????self.memory?=?0
????????self.reset()
????????self.show()
基礎(chǔ)方法:
????def?input_number(self,?v):
????????if?self.state?==?READY:
????????????self.state?=?INPUT
????????????self.stack[-1]?=?v
????????else:
????????????self.stack[-1]?=?self.stack[-1]?*?10?+?v
????????self.display()
????def?display(self):
????????self.lcdNumber.display(self.stack[-1])
按鈕RE,M, RE對(duì)應(yīng)的實(shí)現(xiàn)邏輯:
????def?reset(self):
????????self.state?=?READY
????????self.stack?=?[0]
????????self.last_operation?=?None
????????self.current_op?=?None
????????self.display()
????def?memory_store(self):
????????self.memory?=?self.lcdNumber.value()
????def?memory_recall(self):
????????self.state?=?INPUT
????????self.stack[-1]?=?self.memory
????????self.display()
+,-,x,/,/100對(duì)應(yīng)實(shí)現(xiàn)方法:
def?operation(self,?op):
????????if?self.current_op:??#?Complete?the?current?operation
????????????self.equals()
????????self.stack.append(0)
????????self.state?=?INPUT
????????self.current_op?=?op
????def?operation_pc(self):
????????self.state?=?INPUT
????????self.stack[-1]?*=?0.01
????????self.display()
=號(hào)對(duì)應(yīng)的方法實(shí)現(xiàn):
?def?equals(self):
????????if?self.state?==?READY?and?self.last_operation:
????????????s,?self.current_op?=?self.last_operation
????????????self.stack.append(s)
????????if?self.current_op:
????????????self.last_operation?=?self.stack[-1],?self.current_op
????????????try:
????????????????self.stack?=?[self.current_op(*self.stack)]
????????????except?Exception:
????????????????self.lcdNumber.display('Err')
????????????????self.stack?=?[0]
????????????else:
????????????????self.current_op?=?None
????????????????self.state?=?READY
????????????????self.display()
main函數(shù):
if?__name__?==?'__main__':
????app?=?QApplication([])
????app.setApplicationName("XiaoDing")
????window?=?MainWindow()
????app.exec_()
如果需要完整代碼,直接在公眾號(hào)"程序IT圈",后臺(tái)聊天框回復(fù)【計(jì)算器】,就可以獲取!啟動(dòng)后的界面如下:

關(guān)注小猿公眾號(hào),每天學(xué)習(xí)一道Python題
評(píng)論
圖片
表情
