PyQT投资收益计算器开发
·


import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
QHBoxLayout, QLabel, QLineEdit, QPushButton,
QGroupBox, QFormLayout, QMessageBox)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
class ProfitCalculator(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('投资收益计算器')
self.setFixedSize(500, 500) # 稍微增加高度以容纳更好的边距
# 创建中央窗口部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 设置主布局
main_layout = QVBoxLayout(central_widget)
main_layout.setContentsMargins(20, 20, 20, 20) # 设置边距
main_layout.setSpacing(15) # 设置组件间距
# 创建标题
title_label = QLabel('投资收益计算器')
title_label.setAlignment(Qt.AlignCenter)
title_font = QFont()
title_font.setPointSize(18)
title_font.setBold(True)
title_label.setFont(title_font)
main_layout.addWidget(title_label)
# 创建输入区域
input_group = QGroupBox('输入参数')
input_layout = QFormLayout(input_group)
input_layout.setContentsMargins(15, 15, 15, 15) # 设置组内边距
input_layout.setSpacing(10) # 设置表单行间距
# 创建输入字段
self.initial_price_input = QLineEdit()
self.initial_price_input.setPlaceholderText('例如: 100')
self.final_price_input = QLineEdit()
self.final_price_input.setPlaceholderText('例如: 150')
self.days_input = QLineEdit()
self.days_input.setPlaceholderText('例如: 30')
self.quantity_input = QLineEdit()
self.quantity_input.setPlaceholderText('例如: 100')
# 添加输入字段到布局
input_layout.addRow('初始价格 (元):', self.initial_price_input)
input_layout.addRow('最终价格 (元):', self.final_price_input)
input_layout.addRow('持有天数:', self.days_input)
input_layout.addRow('买入数量:', self.quantity_input)
main_layout.addWidget(input_group)
# 创建按钮
button_layout = QHBoxLayout()
button_layout.setSpacing(20) # 设置按钮间距
self.calculate_button = QPushButton('计算收益')
self.clear_button = QPushButton('清空')
self.calculate_button.clicked.connect(self.calculate_profit)
self.clear_button.clicked.connect(self.clear_inputs)
button_layout.addStretch(1) # 添加弹性空间使按钮居中
button_layout.addWidget(self.calculate_button)
button_layout.addWidget(self.clear_button)
button_layout.addStretch(1) # 添加弹性空间使按钮居中
main_layout.addLayout(button_layout)
# 创建结果显示区域
result_group = QGroupBox('计算结果')
result_layout = QFormLayout(result_group)
result_layout.setContentsMargins(15, 15, 15, 15) # 设置组内边距
result_layout.setSpacing(10) # 设置表单行间距
# 创建结果显示字段
self.return_rate_label = QLabel('--')
self.avg_return_rate_label = QLabel('--')
self.final_profit_label = QLabel('--')
self.final_assets_label = QLabel('--')
# 设置结果标签样式
result_font = QFont()
result_font.setPointSize(12)
result_font.setBold(True)
self.return_rate_label.setFont(result_font)
self.avg_return_rate_label.setFont(result_font)
self.final_profit_label.setFont(result_font)
self.final_assets_label.setFont(result_font)
# 添加结果字段到布局
result_layout.addRow('收益率 (%):', self.return_rate_label)
result_layout.addRow('平均收益率 (%/天):', self.avg_return_rate_label)
result_layout.addRow('最终收益 (元):', self.final_profit_label)
result_layout.addRow('最终资产 (元):', self.final_assets_label)
main_layout.addWidget(result_group)
# 设置样式
self.apply_styles()
def apply_styles(self):
# 设置窗口样式
self.setStyleSheet("""
QMainWindow {
background-color: #f0f0f0;
}
QGroupBox {
font-weight: bold;
border: 2px solid #cccccc;
border-radius: 8px;
margin-top: 1ex;
padding-top: 10px;
}
QGroupBox::title {
subcontrol-origin: margin;
left: 10px;
padding: 0 8px 0 8px;
}
QPushButton {
background-color: #4CAF50;
border: none;
color: white;
padding: 10px 20px;
text-align: center;
text-decoration: none;
font-size: 14px;
font-weight: bold;
margin: 4px 2px;
border-radius: 5px;
min-width: 100px;
}
QPushButton:hover {
background-color: #45a049;
}
QPushButton:pressed {
background-color: #3d8b40;
}
QLineEdit {
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
}
QLabel {
padding: 4px;
font-size: 14px;
}
""")
def calculate_profit(self):
try:
# 获取输入值
initial_price = float(self.initial_price_input.text())
final_price = float(self.final_price_input.text())
days = int(self.days_input.text())
quantity = float(self.quantity_input.text())
# 验证输入值
if initial_price <= 0 or final_price < 0 or days <= 0 or quantity <= 0:
raise ValueError("所有输入值必须为正数")
# 计算收益率
return_rate = ((final_price - initial_price) / initial_price) * 100
# 计算平均收益率
avg_return_rate = return_rate / days
# 计算最终收益
final_profit = (final_price - initial_price) * quantity
# 计算最终资产金额
final_assets = final_price * quantity
# 更新显示结果
self.return_rate_label.setText(f"{return_rate:.2f}")
self.avg_return_rate_label.setText(f"{avg_return_rate:.4f}")
self.final_profit_label.setText(f"{final_profit:.2f}")
self.final_assets_label.setText(f"{final_assets:.2f}")
# 根据收益正负设置颜色
if return_rate >= 0:
self.return_rate_label.setStyleSheet("color: green;")
self.avg_return_rate_label.setStyleSheet("color: green;")
self.final_profit_label.setStyleSheet("color: green;")
self.final_assets_label.setStyleSheet("color: black;") # 最终资产始终显示黑色
else:
self.return_rate_label.setStyleSheet("color: red;")
self.avg_return_rate_label.setStyleSheet("color: red;")
self.final_profit_label.setStyleSheet("color: red;")
self.final_assets_label.setStyleSheet("color: black;") # 最终资产始终显示黑色
except ValueError as e:
QMessageBox.warning(self, "输入错误", f"请输入有效的数值:\n{str(e)}")
except ZeroDivisionError:
QMessageBox.warning(self, "计算错误", "初始价格不能为零")
except Exception as e:
QMessageBox.critical(self, "错误", f"发生未知错误:\n{str(e)}")
def clear_inputs(self):
# 清空所有输入字段和结果
self.initial_price_input.clear()
self.final_price_input.clear()
self.days_input.clear()
self.quantity_input.clear()
self.return_rate_label.setText('--')
self.avg_return_rate_label.setText('--')
self.final_profit_label.setText('--')
self.final_assets_label.setText('--')
self.return_rate_label.setStyleSheet("")
self.avg_return_rate_label.setStyleSheet("")
self.final_profit_label.setStyleSheet("")
self.final_assets_label.setStyleSheet("")
if __name__ == '__main__':
app = QApplication(sys.argv)
calculator = ProfitCalculator()
calculator.show()
sys.exit(app.exec_())
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)