shyoldboy 发表于 2021-7-29 13:56

python中的GUI框架-PyQt,实现简易计算器

本帖最后由 shyoldboy 于 2021-7-31 09:35 编辑

计算器实现可以以一个思维导图的形式表现出来

上面就是我写计算器的思路
下面是我所写的代码
需要下载 PyQt5

cmd到命令行工具

执行下载命令 pip install PyQt5

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 == ''):
                  text = text
                self.qline.setText(text)
            else: # 如果不是的话,追加到数值上面
                '''追加数字'''
                text = self.qline.text()
                text += key
                while(text == ''):
                  text = text
                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)进行操作并返回数值的函数
上面的计算器思路是传统计算器,不是这种算式形式,下面的代码借用原有代码 实现了这种算式的操作


代码如下:
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_())
本次就更新了另一种计算器实现方式
欢迎留言,欢迎批评指正,下次对代码进行重构,使得代码更加美丽,后期会使用面向对象来实现

kk159 发表于 2021-7-29 17:38

LZ代码写的不怎样,思维导图却是有一手!!佩服佩服!!!

Angel-Hang 发表于 2021-7-29 14:29

大佬,求解pyqt5如何使用多线程

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

谢谢分享。
页: [1] 2 3
查看完整版本: python中的GUI框架-PyQt,实现简易计算器