本文主要是介绍光说不练,假把式!Python定做一个计算器,小而美哒~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 计算器实现逻辑
导入库:
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *import operatorfrom MainWindow import Ui_MainWindow
主题代码逻辑很精简:
# Calculator state.
READY = 0
INPUT = 1class 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.7self.pushButton_pc.pressed.connect(self.operation_pc)self.pushButton_eq.pressed.connect(self.equals)# Setup actionsself.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 = 0self.reset()self.show()
def input_number(self, v):if self.state == READY:self.state = INPUTself.stack[-1] = velse:self.stack[-1] = self.stack[-1] * 10 + vself.display()def display(self):self.lcdNumber.display(self.stack[-1])
按钮RE
,M
, RE
对应的实现逻辑:
def reset(self):self.state = READYself.stack = [0]self.last_operation = Noneself.current_op = Noneself.display()def memory_store(self):self.memory = self.lcdNumber.value()def memory_recall(self):self.state = INPUTself.stack[-1] = self.memoryself.display()
+
,-
,x
,/
,/100
对应实现方法:
def operation(self, op):if self.current_op: # Complete the current operationself.equals()self.stack.append(0)self.state = INPUTself.current_op = opdef operation_pc(self):self.state = INPUTself.stack[-1] *= 0.01self.display()
=
号对应的方法实现:
def equals(self):if self.state == READY and self.last_operation:s, self.current_op = self.last_operationself.stack.append(s)if self.current_op:self.last_operation = self.stack[-1], self.current_optry:self.stack = [self.current_op(*self.stack)]except Exception:self.lcdNumber.display('Err')self.stack = [0]else:self.current_op = Noneself.state = READYself.display()
main函数:
if __name__ == '__main__':app = QApplication([])app.setApplicationName("XiaoDing")window = MainWindow()app.exec_()
完整代码只有100行。核心的代码全部都在上面,编程需要不断的实战练习,动手最重要,看别人的说千变道万边,不如动手撸一遍!
另外我们小密圈的Python标准库实战,目前有近60人参加,已经开始了。
往期小密圈:
小密圈的趣味实战-微信主题
小密圈人气很高的两个实战项目
Python心得和技巧:
零基础学了8个月的Python,到底有啥感悟
我珍藏的一些好的Python代码,技巧
菜鸟写Python程序,如何从新手变老手
菜鸟必收藏,13个Python惯用小技巧
这篇关于光说不练,假把式!Python定做一个计算器,小而美哒~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!