zoukankan      html  css  js  c++  java
  • pyQt5 计算器

    参考:  PyQt5中文教程

    '''
    思路:
        设置按钮,
        添加到网格布局中
    
        为按钮添加功能
    
        解决问题:
            除零 报错
            等号后 直接按数字问题
    
    '''
    
    import sys
    from PyQt5.QtWidgets import QWidget, QApplication, QLineEdit, QPushButton, QGridLayout, QHBoxLayout, QVBoxLayout
    from PyQt5.QtGui import QIcon, QFont
    from PyQt5.QtCore import Qt
    
    
    class Calculater(QWidget):
        def __init__(self):
            super().__init__()
    
            self.initUI()
            # 初始化属性值
            self.reset()
    
    
        def initUI(self):
    
            # 创建窗口标题
            self.setWindowTitle("计算器")
            self.setWindowIcon(QIcon("icon.ico"))
            # 网格布局
            gridLayout =  QGridLayout()
    
            # 设置文本
            self.lineEdit = QLineEdit("0")
            # 文本从右面开始显示
            self.lineEdit.setAlignment(Qt.AlignRight)
            # 禁止直接输入 只读
            self.lineEdit.setReadOnly(True)
            # 设置显示文本得到字体
            self.lineEdit.setFont(QFont("Times", 20))
            # 设置最多显示的数字长度
            self.lineEdit.setMaxLength(15)
            # 创建按钮
            # btn = QPushButton()
    
            # 创建
            names = [
                "AC", "Del", "", "close",
                "7",  "8", "9", "+",
                "4",  "5", "6", "-",
                "1", "2", "3", "*",
                "0", ".", "=", "/",
            ]
    
            grids = [(i, j) for i in range(1, 6) for j in range(0, 4)]
            # 将单行文本框加入布局
            gridLayout.addWidget(self.lineEdit, 0, 0, 1, 4)
            # 构建表格
            for grid, name in zip(grids, names):
    
                btn = QPushButton(name)
                btn.resize(btn.sizeHint())
                btn.setFixedSize(60, 30)
                btn.clicked.connect(self.buttonClick)
    
                # if name == "0":
                #     # 后边的四个参数分别是 行 , 列, 行跨度, 列跨度
                #     print(grid[1])
                #     gridLayout.addWidget(QPushButton(name), grid[0], grid[1], 1, 2)
                # elif name == ".":
                #     gridLayout.addWidget(QPushButton(name), grid[0], grid[1]+1, 1, 1)
                # elif name == "=":
                #     btn = QPushButton(name)
                #
                #     gridLayout.addWidget(btn, grid[0], grid[1], 2, 1)
                # else:
                #     gridLayout.addWidget( QPushButton(name), *grid)
                if name == "":
                    continue
                else:
                    gridLayout.addWidget(btn, *grid)
    
            self.setLayout(gridLayout)
            self.show()
    
        def buttonClick(self):
            # 获取number
            text = self.sender().text()
            if text in "+-*/":
                self.string += text
                # 用来存储表达式
                self.number = ""
                # 在这里如果继续执行的话在界面展示会有问题所以退出
                self.last = text
                return
            # 用eval的话不需要判断点
            # elif text == ".":
    
            elif text == "=":
                self.resault()
                return
    
            elif text == "AC":
                self.reset()
            elif text == "Del":
                self.deleat()
            elif text == "close":
                self.close()
    
            else:
                # 如果之前已经按了等号在按数字的话清空之前的值
                if self.last == "=" and type(eval(text)) == int:
                    self.reset()
                # 除零判断
                elif self.last == "/" and text == "0":
                    self.number = "error"
                    self.lineEdit.setText(self.number)
                    return
                # 如果 self.number != 0 self.number = self.number + text 否则 self.number = text
                self.number = self.number + text if self.number != "0" else text
                self.string += text
                # 用来记录按键
            self.lineEdit.setText(self.number)
    
    
        def resault(self):
    
            self.lineEdit.setText(str(eval(self.string)))
            # 这一个设置每次运算完后直接将结果改变
            self.string = str(eval(self.string))
            self.number = ""
            self.last = "="
    
    
    
        def reset(self):
            #重置用来接收按钮数字
            self.number = "0"
            # 重置用来存储按钮数字和运算符的字符串
            self.string = ""
            self.last = ""
            self.symbol = ""
    
        def deleat(self):
            self.string = self.string[0:-1]
            # self.number = self.number[0:-1]
            # # 如果self.number 的删除后为空则设置为0
            # if not self.number:
            #     self.number = "0"
            # 间写
            self.number = self.number[0: -1] if self.number[0: -1] else "0"
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ex = Calculater()
        sys.exit(app.exec_())
    

      

  • 相关阅读:
    循环结构进阶
    数组
    循环结构(二)
    循环结构(一)
    选择结构(二)
    选择结构(一)
    Ext tabpanel集成第三方charts(echarts、amcharts等)的问题(报getstyle为null的错误)
    JAVA调用.NET WebService终极方案(包含对SoapHeader的处理)
    【翻译】Organizing ASP.NET MVC solutions 如何组织你的ASP.NET MVC解决方案
    03、Kibana WEB安装配置
  • 原文地址:https://www.cnblogs.com/ShanCe/p/10442440.html
Copyright © 2011-2022 走看看