分享

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

 工业自动化设备 2020-03-05

1 ui设计

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

conda3.05\Library\bin

designer.exe文件,双击启动:

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

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

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

私信小编01 领取完整项目代码

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

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

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

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

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

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 = 0INPUT = 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.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()

基础方法:

    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对应的实现逻辑:

    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对应实现方法:

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

=号对应的方法实现:

 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函数:

if __name__ == '__main__':    app = QApplication([])    app.setApplicationName('XiaoDing')    window = MainWindow()    app.exec_()

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

用Python定做一款小而美的计算器
内容来自今日头条

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多