13161216443

您所在位置: 首頁> 學習課程> python培訓學校 | 時間Python定做個屬于自己的計算器

python培訓學校 | 時間Python定做個屬于自己的計算器

發布百知教育 來源:學習課程 2019-12-09

本文一起來用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 計算器實現邏輯

導入庫:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

import operator

from MainWindow import Ui_MainWindow

主題代碼邏輯很精簡:

# 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(010):
            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_()

如果需要完整代碼,直接在公眾號"程序IT圈",后臺聊天框回復【計算器】,就可以獲??!啟動后的界面如下:

8.png



python培訓班:http://www.onhairsalon.com/python2019


上一篇:python培訓班 | Python Web 開發之 JWT 簡介

下一篇:應屆生去公司找個Java程序員的職位需要什么技能?

相關推薦

www.onhairsalon.com

有位老師想和您聊一聊

關閉

立即申請