吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2744|回复: 26
收起左侧

[Python 转载] python中的GUI框架-PyQt,实现简易计算器

[复制链接]
shyoldboy 发表于 2021-7-29 13:56
本帖最后由 shyoldboy 于 2021-7-31 09:35 编辑

计算器实现可以以一个思维导图的形式表现出来
Calculate.png
上面就是我写计算器的思路
下面是我所写的代码

需要下载 PyQt5

cmd到命令行工具

执行下载命令 pip install PyQt5

[Python] 纯文本查看 复制代码
import decimal
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QVBoxLayout,QWidget
import sys
class tWindow(QWidget):
    
    def __init__(self) -> None:
        super().__init__()
        self.firstnum = '' # 记录输入的第一个数据
        self.secondnum = ''# 记录输入的第二个数据
        self.fuhao = ''# 记录输入的算数运算符信息
        self.beforestr = '' # 记录点击该按钮之前的点击信息
        self.inittabUI() # 初始化界面方法
    def numys(self):  # 对两个数进行操作
        if self.fuhao == '+': # '0.12' + '0.21'
            return decimal.Decimal(self.firstnum) + decimal.Decimal(self.secondnum)
        elif self.fuhao == '-':
            return decimal.Decimal(self.firstnum) - decimal.Decimal(self.secondnum)
        elif self.fuhao == '*':
            return decimal.Decimal(self.firstnum) * decimal.Decimal(self.secondnum)
        elif self.fuhao == '/':
            return decimal.Decimal(self.firstnum) / decimal.Decimal(self.secondnum)
    def click(self): # 所有按钮的点击事件
        key = self.sender().text() # 获取所点击按钮的值
        # 如果输入的是运算符号,则清空文本框数据并记录
        if key in ('+','-','*','/'): # 根据值的不同来确定那个按钮被点击
            text = self.qline.text() # 获取文本框的值
            '''
                和实体计算器一样,文本框默认值是0
                本步骤是为了拼接第二个数的逻辑 
                如果不为0则存储数据和符号'''
            if text != '' and self.fuhao == '': 
                self.firstnum += text # 如果不为0说明,文本框有值,符号为空,说明此次输入为第一次输入。故存储第一个值
                self.fuhao = key # 并将符号进行存储
            elif text != '' and self.fuhao != '':
                self.secondnum = text # 如果符号不为空,且文本框有值
                # 将运算结果放在上面
                self.qline.setText(self.numys()) #调用运算方法并给文本框进行设置
                self.firstnum = self.numys() # 然后将该值赋给第一个值,是为了存储前面的结果给下一次计算使用,功能正在实现中。。。。。
            self.beforestr = key # 最后记录本次点击的痕迹                    
        # 如果输入的是等于号,则将运算结果展示在文本框
        elif key in ('0','1','2','3','4','5','6','7','8','9','.'):            
            if self.beforestr in ('+','-','*','/'):  #如果上一次输入是运算符,清空,重新输入第二个值
                self.qline.clear()
                text = self.qline.text()
                text += key
                while(text[0] == ''):
                    text = text[1:]
                self.qline.setText(text) 
            else: # 如果不是的话,追加到数值上面
                '''追加数字'''
                text = self.qline.text()
                text += key
                while(text[0] == ''):
                    text = text[1:]
                self.qline.setText(text)           
            self.beforestr = key
        # 如果输入的Cls则将 数据清空
        elif key == 'Cls':
            self.firstnum = ''
            self.secondnum = ''
            self.fuhao = ''
            self.qline.clear() #将所有值清空,将文本框的值设置成默认值
        elif key == 'Bck':
            text = self.qline.text()
            text = text[-len(text):-1] # 利用切片一直切到最后一位
            self.qline.setText(text)
        elif key == '=': 
            text = self.qline.text()  #如果点等于的话,直接获取文本框的数值
            self.secondnum = text
            sum = self.numys() # 进行运算
            #符号清空
            self.qline.setText(str(sum)) # 将总和设置到文本框上面
            self.fuhao = '' # 对符号进行清空
            self.firstnum = ''
            self.secondnum = ''
    def inittabUI(self):
        # 添加文本框
        self.qline = QLineEdit()
        self.qline.setPlaceholderText('0')
        self.qline.setAlignment(QtCore.Qt.AlignRight)
        # self.qline.setEnabled(False)
        self.qline.setFocusPolicy(QtCore.Qt.NoFocus)
        grid = QGridLayout()
        self.setLayout(grid)
        names = ['Cls', 'Bck', 'CE', 'Close',
                 '7', '8', '9', '/',
                '4', '5', '6', '*',
                 '1', '2', '3', '-',
                '0', '.', '=', '+']
        positions = [(i,j) for i in range(1,6) for j in range(4)]
        
        grid.addWidget(self.qline,0,0,1,4)
        for position,name in zip(positions,names):
            button = QPushButton(name)
            button.clicked.connect(self.click)
            grid.addWidget(button, *position)
        # self.move(300, 150)
        self.setWindowTitle('Calculator')
        # self.setFixedSize(self.width(), self.height());  
        self.setWindowIcon(QIcon(r'D:\workspace\pyqt入门\b11.png'))
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    tw = tWindow()
    sys.exit(app.exec_())


计算器仅仅实现了基础的操作,对于一些非法情况未作详细处理

思维导图未对GUI的部分进行详细描述,有想了解的,回复我,再对此做详细制作

对于本篇博客,有什么好的呈现方式,大家可以共同探讨一下。

上次有个大佬说有个方法eval()可以实现
这个函数是对算式(eg:1+2*4+3)进行操作并返回数值的函数
上面的计算器思路是传统计算器,不是这种算式形式下面的代码借用原有代码 实现了这种算式的操作


代码如下:
[Python] 纯文本查看 复制代码
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QVBoxLayout,QWidget
import sys
class tWindow(QWidget):
    
    def __init__(self) -> None:
        super().__init__()
        self.text = ''
        self.inittabUI() # 初始化界面方法
        
    def numys(self,str1):  # 对两个数进行操作
        return str(eval(str1))
    # def text_changed(self):
    #     print('改变了')
    def click(self): # 所有按钮的点击事件
        key = self.sender().text() # 获取所点击按钮的值
        # 如果输入的是运算符号,则清空文本框数据并记录
        if key in ('+','-','*','/'): # 根据值的不同来确定那个按钮被点击
            self.text = self.qline.text() # 获取文本框的值,进行追加
            self.text += key                  
            self.qline.setText(self.text)
        # 如果输入的是等于号,则将运算结果展示在文本框
        elif key in ('0','1','2','3','4','5','6','7','8','9','.'):            
            self.text = self.qline.text() # 获取文本框的值,进行追加
            self.text += key
            self.qline.setText(self.text)
        # 如果输入的Cls则将 数据清空
        elif key == 'Cls':
            self.qline.clear() #将所有值清空,将文本框的值设置成默认值
        elif key == 'Bck':
            text = self.qline.text()
            text = text[-len(text):-1] # 利用切片一直切到最后一位
            self.qline.setText(text)
        elif key == '=': 
            text = self.qline.text()  #如果点等于的话,直接获取文本框的数值
            sum = self.numys(text) # 进行运算
            self.qline.setText(sum)
    def inittabUI(self):
        # 添加文本框
        self.qline = QLineEdit()
        self.qline.setPlaceholderText('0')
        self.qline.setAlignment(QtCore.Qt.AlignRight)
        # self.qline.setEnabled(False)
        self.qline.setFocusPolicy(QtCore.Qt.NoFocus)
        grid = QGridLayout()
        self.setLayout(grid)
        names = ['Cls', 'Bck', 'CE', 'Close',
                 '7', '8', '9', '/',
                '4', '5', '6', '*',
                 '1', '2', '3', '-',
                '0', '.', '=', '+']
        positions = [(i,j) for i in range(1,6) for j in range(4)]
        
        grid.addWidget(self.qline,0,0,1,4)
        for position,name in zip(positions,names):
            button = QPushButton(name)
            button.clicked.connect(self.click)
            grid.addWidget(button, *position)
        # self.move(300, 150)
        self.setWindowTitle('Calculator')
        # self.setFixedSize(self.width(), self.height());  
        self.setWindowIcon(QIcon(r'D:\workspace\pyqt入门\b11.png'))
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    tw = tWindow()
    sys.exit(app.exec_())

本次就更新了另一种计算器实现方式
欢迎留言,欢迎批评指正,下次对代码进行重构,使得代码更加美丽,后期会使用面向对象来实现

免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
Rothschild_HHU + 1 谢谢@Thanks!
pikaqiuqiuqiu + 1 + 1 我很赞同!
passtoworld + 1 + 1 用心讨论,共获提升!
fjzry + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kk159 发表于 2021-7-29 17:38
LZ代码写的不怎样,思维导图却是有一手!!佩服佩服!!!
Angel-Hang 发表于 2021-7-29 14:29
dcsyzx123 发表于 2021-7-29 14:38
近来开始学习python,在论坛里遨游收获颇多!谢谢各位大神!
andyniworld 发表于 2021-7-29 14:40
多向大神看齐,努力学习
lanail 发表于 2021-7-29 14:44
调用的那个数学算法
ycz0030 发表于 2021-7-29 15:14
不错,多谢分享
yxn4065 发表于 2021-7-29 15:17
挺不错的
zeng16 发表于 2021-7-29 15:31

不错,多谢分享
武胜造纸农 发表于 2021-7-29 15:51
不错,谢谢分享
cq001TAT 发表于 2021-7-29 16:32
谢谢分享。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-1 11:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表