12.14 用Python定做一款小而美的计算器

1 ui设计

使用qt designer ,按装anaconda后,在如下路径找到:

conda3.05\\Library\\bin

designer.exe文件,双击启动:

用Python定做一款小而美的计算器


创建窗体,命名为XiaoDing,整个的界面如下所示:

用Python定做一款小而美的计算器


qt 设计器提供的常用控件基本都能满足开发需求,通过拖动左侧的控件,很便捷的就能搭建出如下的UI界面,比传统的手写控件代码要方便很多。

最终设计的计算器XiaoDing界面如下,

用Python定做一款小而美的计算器


比如,其中一个用于计算器显示的对象:lcdNumber,对象的类型为:LCD Number。右侧为计算器中用到的所有对象。

用Python定做一款小而美的计算器


用Python定做一款小而美的计算器


2 转py文件

使用如下命令,将设计好的ui文件转为py文件

pyuic5 -o ./calculator/MainWindow.py ./calculator/mainwindow.ui

3 计算器实现逻辑

导入库:

fromPyQt5.QtGuiimport*
fromPyQt5.QtWidgetsimport*
fromPyQt5.QtCoreimport*

importoperator

fromMainWindowimportUi_MainWindow

主题代码逻辑很精简:

#Calculatorstate.
READY=0
INPUT=1


classMainWindow(QMainWindow,Ui_MainWindow):
def__init__(self,*args,**kwargs):
super(MainWindow,self).__init__(*args,**kwargs)
self.setupUi(self)

#Setupnumbers.
forninrange(0,10):
getattr(self,'pushButton_n%s'%n).pressed.connect(lambdav=n:self.input_number(v))

#Setupoperations.
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.divforPython2.7

self.pushButton_pc.pressed.connect(self.operation_pc)
self.pushButton_eq.pressed.connect(self.equals)

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


基础方法:

definput_number(self,v):
ifself.state==READY:
self.state=INPUT
self.stack[-1]=v
else:
self.stack[-1]=self.stack[-1]*10+v

self.display()

defdisplay(self):
self.lcdNumber.display(self.stack[-1])

按钮RE,M, RE对应的实现逻辑:

defreset(self):
self.state=READY
self.stack=[0]
self.last_operation=None
self.current_op=None
self.display()

defmemory_store(self):
self.memory=self.lcdNumber.value()

defmemory_recall(self):

self.state=INPUT
self.stack[-1]=self.memory
self.display()


+,-,x,/,/100对应实现方法:

defoperation(self,op):
ifself.current_op:#Completethecurrentoperation
self.equals()

self.stack.append(0)
self.state=INPUT
self.current_op=op

defoperation_pc(self):
self.state=INPUT
self.stack[-1]*=0.01
self.display()

=号对应的方法实现:

defequals(self):
ifself.state==READYandself.last_operation:
s,self.current_op=self.last_operation
self.stack.append(s)

ifself.current_op:
self.last_operation=self.stack[-1],self.current_op

try:
self.stack=[self.current_op(*self.stack)]
exceptException:
self.lcdNumber.display('Err')
self.stack=[0]
else:
self.current_op=None
self.state=READY
self.display()

main函数:

if__name__=='__main__':
app=QApplication([])

app.setApplicationName("XiaoDing")

window=MainWindow()
app.exec_()

完整代码请参考点击阅读原文下载,代码只有100行。完整代码请点击文章最底部的【阅读原文】。启动后的界面如下:

用Python定做一款小而美的计算器


分享到:


相關文章: