我与PyQt5有个约会系列教程(6):计算器的实现并了解一下静态文本控件QLabel的简单应用

    技术2022-07-27  75

    经过前面5章的学习,学习了按钮控件QPushButton、可控文本控件QLineEdit以及提示消息框控件QMessageBox的应用。

    这一章通过实践学习写一个功能完全的计算器小软件,进一步加强以上三个控件的学习及应用。

    与此同时,还要学习一个新的静态文本控件的应用。

     

    接下来,先让我们了解一下计算器小软件的风采:

    源代码,臣妾双手奉上 :

    # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout, QMessageBox, QLabel, QFrame from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt import math class Example(QWidget): def __init__(self): super().__init__() self.Init_UI() # 定义存储在文本中的变量 self.resultStr = '' def Init_UI(self): grid = QGridLayout() self.setLayout(grid) self.setGeometry(300,300,400,360) self.setWindowTitle('我与PyQt5有个约会 -- 简易计算器') self.setWindowIcon(QIcon('myico.ico')) rowSpan = 5 self.calcQLabel = QLabel(self) self.calcQLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) self.calcQLabel.setAlignment(Qt.AlignBottom | Qt.AlignRight) self.calcQLabel.setStyleSheet("font-size:36px") grid.addWidget(self.calcQLabel, 0, 0, rowSpan, 0) grid.setSpacing(10) names = ['7', '8', '9', 'DEL', 'AC', '4', '5', '6', '*', '/', '1', '2', '3', '+', '-', '0', '%', 'PI', 'e', 'sqrt', '^', 'sin', 'cos', 'tan', 'log', 'ln', '(', ')', '.', '='] positions = [(y, x) for y in range(rowSpan + 1, rowSpan + 7) for x in range(0, 5)] for position, name in zip(positions, names): if name == '': continue button = QPushButton(name) grid.addWidget(button, *position) button.clicked.connect(self.OnQBtnClick) self.show() def OnQBtnClick(self): mathFunc = ['sqrt', 'sin', 'cos', 'tan'] result = 'Error' sender = self.sender().text() print('sender is {}' .format(sender)) if sender == '=': print("=") for func in mathFunc: if func in self.resultStr: try: result = str(eval('math.'+self.resultStr)) break except: pass if '^' in self.resultStr: try: temp = self.resultStr.split('^') result = str(eval('pow('+temp[0]+','+temp[1]+')')) except: pass elif 'ln' in self.resultStr: try: result = str(eval('math.log'+self.resultStr[2:])) except: pass elif 'log' in self.resultStr: try: result = str(eval('math.log'+self.resultStr[3:]+'/math.log(10)')) except: pass else: try: result = str(eval(self.resultStr)) except: pass print('result = {}' .format(result)) self.calcQLabel.setText(result) elif sender == 'AC' : '''click button "AC" to clear screen''' self.resultStr = '' self.calcQLabel.setText(self.resultStr) elif sender == 'DEL' : '''click button "DEL" to Undo''' self.resultStr = self.resultStr[:-1] self.calcQLabel.setText(self.resultStr) elif sender == 'e' : '''e=math.e''' self.resultStr += str(math.e) self.calcQLabel.setText(self.resultStr) elif sender == 'PI' : '''pi=3.1416''' self.resultStr += str(math.pi) self.calcQLabel.setText(self.resultStr) else: self.resultStr += sender self.calcQLabel.setText(self.resultStr) # 关闭程序 def closeEvent(self, event): reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() app.exit(app.exec_())

    新增代码解析 :

    # 创建一个静态文本QLabel控件 self.calcQLabel = QLabel(self) # 给QLabel控件添加风格 self.calcQLabel.setFrameStyle(QFrame.Panel | QFrame.Sunken) # 文字在QLabel控件中的放置位置 self.calcQLabel.setAlignment(Qt.AlignBottom | Qt.AlignRight) # 文字在QLabel控件中的显示大小 self.calcQLabel.setStyleSheet("font-size:36px")

    计算其中所有功能的实现:

    def OnQBtnClick(self): mathFunc = ['sqrt', 'sin', 'cos', 'tan'] result = 'Error' sender = self.sender().text() print('sender is {}' .format(sender)) if sender == '=': print("=") for func in mathFunc: if func in self.resultStr: try: result = str(eval('math.'+self.resultStr)) break except: pass if '^' in self.resultStr: try: temp = self.resultStr.split('^') result = str(eval('pow('+temp[0]+','+temp[1]+')')) except: pass elif 'ln' in self.resultStr: try: result = str(eval('math.log'+self.resultStr[2:])) except: pass elif 'log' in self.resultStr: try: result = str(eval('math.log'+self.resultStr[3:]+'/math.log(10)')) except: pass else: try: result = str(eval(self.resultStr)) except: pass print('result = {}' .format(result)) self.calcQLabel.setText(result) elif sender == 'AC' : '''click button "AC" to clear screen''' self.resultStr = '' self.calcQLabel.setText(self.resultStr) elif sender == 'DEL' : '''click button "DEL" to Undo''' self.resultStr = self.resultStr[:-1] self.calcQLabel.setText(self.resultStr) elif sender == 'e' : '''e=math.e''' self.resultStr += str(math.e) self.calcQLabel.setText(self.resultStr) elif sender == 'PI' : '''pi=3.1416''' self.resultStr += str(math.pi) self.calcQLabel.setText(self.resultStr) else: self.resultStr += sender self.calcQLabel.setText(self.resultStr)

    这一章没有过多的解释,因为很多时候,授人以鱼,不如授之以渔,授人以鱼只救一时之急,授人以渔则可解一生之需。

    不懂的地方,可以留言或者私信给我,看到后,我会第一时间解答。

    谢谢,这一章就到这里。

     

    Processed: 0.008, SQL: 9