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

11 篇文章 1 订阅

经过前面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)

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

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

谢谢,这一章就到这里。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值