项目需求¶
使用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)