在这里插入图片描述
在这里插入图片描述

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_())
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐