跳转至

项目需求

使用PyQt实现计算器应用

实现步骤

1. 布局实现

# 网格布局  上部分 QLabel  占用1行4列

from PyQt5.QtWidgets import QApplication,QWidget,QGridLayout,QLabel,QPushButton
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt
import sys

def func():
    # 获取点击的按钮
    btnTxt = w.sender().text()
    # 获取原来输入的内容
    content = label.text()
    # 根据每一个文字处理
    if btnTxt=='C':
        label.setText('0')
    elif btnTxt=='Del':
        # 如果长度为1 需要直接设置为0
        if len(content)==1:
            label.setText('0')
        else:
            # 去掉最后一位
            label.setText(content[:-1])
    elif btnTxt=='=':
        # 求结果 数值型
        try:
            result = eval(content)
            # 展示字符串
            str = '{}{}\n{}'.format(content,btnTxt,result)
            label.setText(str)
        except:
            pass
    else:
        # 判断是否原来的内容是0
        if content=='0':
            label.setText(btnTxt)
        else:
            # 普通按钮 显示
            label.setText(content+btnTxt)


# 按钮文字
names = ['C', '(', 'Del', '+',
         '7', '8', '9', '-',
         '4', '5', '6', '*',
         '1', '2', '3', '/',
         '0', '.', ')', '=']
# 按钮的位置
poses = [(1, 0), (1, 1), (1, 2), (1, 3),
       (2, 0), (2, 1), (2, 2), (2, 3),
       (3, 0), (3, 1), (3, 2), (3, 3),
       (4, 0), (4, 1), (4, 2), (4, 3),
       (5, 0), (5, 1), (5, 2), (5, 3)]


# 创建程序
app = QApplication(sys.argv)
# 创建窗口
w = QWidget()
# 标题
w.setWindowTitle('计算器')

# ---------------------- 布局 ---------------------- #
layout = QGridLayout()
# 设置布局
w.setLayout(layout)
# ---------------------- 上部分 ---------------------- #
label = QLabel('0')
# 控件背景
label.setStyleSheet('background-color:gray;')
# 设置高度
label.setFixedHeight(100)
# 设置字体
font = QFont('宋体',25)
label.setFont(font)
# 指定内容展示位置
label.setAlignment(Qt.AlignBottom|Qt.AlignRight)
# 指定占用多行多列
layout.addWidget(label,0,0,1,4)

# ---------------------- 下部分按钮 ---------------------- #
# for name in names:
#     btn = QPushButton(name)
#     # 获取name在nemes中的索引
#     i = names.index(name)
#     # 根据索引在poses获取对应的位置
#     pose = poses[i]
#     # row
#     row = pose[0]
#     # col
#     col = pose[1]
#     # 添加到布局中
#     layout.addWidget(btn,row,col)

# ---------------------- 下部分布局 ---------------------- #
# for index in range(0,len(names)):
#     # 获取name
#     name = names[index]
#     # 获取pose
#     pose = poses[index]
#     # 创建按钮
#     btn = QPushButton(name)
#     # 添加到布局中
#     layout.addWidget(btn,pose[0],pose[1])

# ---------------------- 下部分布局:同时遍历 ---------------------- #
# for name,pose in zip(names,poses):
#     # 创建按钮
#     btn = QPushButton(name)
#     # 添加到布局中
#     # layout.addWidget(btn,pose[0],pose[1])
#     # *pose 传递参数的时候  解开元组传递数据
#     layout.addWidget(btn,*pose)
# ---------------------- 下部分 样式处理 ---------------------- #
for name,pose in zip(names,poses):
    # 创建按钮
    btn = QPushButton(name)
    # 宽度和高度
    btn.setFixedSize(40,40)
    if name=='C':
        # 如果C改变颜色
        btn.setStyleSheet('color:orange;')
    elif name=='=':
        # 如果是=改变背景颜色
        btn.setStyleSheet('background-color:orange;')
    # 添加到布局中
    layout.addWidget(btn,*pose)
    # 信号和槽绑定
    btn.clicked.connect(func)


# 显示窗口
w.show()
# 等待窗口停止
sys.exit(app.exec())

整体采用网格布局,

2. 功能实现

def btnClick():
    '''
    按钮点击事件槽函数
    :return:
    '''
    # 获取原来的文字
    content = label.text()
    # 获取点击的按钮文字
    senderText = w.sender().text()
    if senderText=='C':
        label.setText('0')
    elif senderText=='Del':
        # 把最后一个元素去掉
        content = content[:-1]
        if not content:
            content='0'
        label.setText(content)
    elif senderText=='=':
        # 计算结果
        result = eval(content)
        # 显示
        label.setText('{}{}\n{}'.format(content,senderText,result))
        # print(content+senderText+str(result))
    else:
        # 除了C Del =
        if content=='0':
            label.setText(senderText)
        else:
            # 显示完整内容
            label.setText(content+senderText)
'''---------------------- 按钮 ----------------------'''
for index in range(len(names)):
    ...
    # 绑定槽函数
    btn.clicked.connect(btnClick)