1 ui设计
使用qt designer ,按装anaconda后,在如下路径找到:
conda3.05\\Library\\bin
designer.exe文件,双击启动:
创建窗体,命名为XiaoDing,整个的界面如下所示:
qt 设计器提供的常用控件基本都能满足开发需求,通过拖动左侧的控件,很便捷的就能搭建出如下的UI界面,比传统的手写控件代码要方便很多。
最终设计的计算器XiaoDing界面如下,
比如,其中一个用于计算器显示的对象:lcdNumber,对象的类型为:LCD Number。右侧为计算器中用到的所有对象。
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行。完整代码请点击文章最底部的【阅读原文】。启动后的界面如下:
閱讀更多 有趣的程序媛 的文章