入门 PyQt6 看过来(项目)29 在线购物-销售分析

news2024/11/14 21:50:23

销售分析部分包含按月分析的簇状图和按类别分析的饼图,如下:

1 页面设计

设计该页面其实很简单,说白了就是两个也切tab类以及饼图和簇状图。打开QTDesiger,按下图添加控件,并重命名如下:

2 按类别分析

	#按类别功能函数
    def analyByType(self):
        #创建QPieSeries对象,用来存放饼图的数据
        pseries=QPieSeries()
        for item in typeset.items():
            pseries.append(item[0], item[1])
        slice=pseries.slices()[0]
        slice.setExploded(True)
        slice.setLabelVisible(True)
        slice.setPen(QPen(Qt.GlobalColor.red,2))
        slice.setBrush(Qt.GlobalColor.red)

        #创建QChart实例
        chart=QChart()
        chart.addSeries(pseries)
        chart.createDefaultAxes()
        #设置图表
        chart.setTitle("商品按类别销售数据分析")
        #动画效果
        chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignmentFlag.AlignBottom)
        #2显示图表
        chartView=QChartView(chart)
        #绘制平滑
        chartView.setRenderHint(QPainter.RenderHint.Antialiasing)
        self.layout1=QGridLayout(self.frmType)
        self.layout1.addWidget(chartView)

3 按月分析

	#按月份
    def analyByMonth(self):
        bseries=QBarSeries()
        lseries=QLineSeries()
        #添加数据
        monthset=QBarSet('')
        for i in range(0,12):
            monthset << money_m[i]
            lseries.append(i, money_m[i])
        bseries.append(monthset)
        lseries.setColor(QColor(255,0,0))
        #创建QChart实例
        chart=QChart()
        #不显示图例
        chart.legend().hide()
        chart.addSeries(bseries)
        chart.addSeries(lseries)
        #设置坐标
        axis_x=QBarCategoryAxis()
        axis_x.setTitleText('月份')
        axis_x.append(month)
        chart.addAxis(axis_x,Qt.AlignmentFlag.AlignBottom)
        lseries.attachAxis(axis_x)
        axis_y=QValueAxis()
        axis_y.setTitleText('金额(元)')
        axis_y.setLabelFormat("%d")
        chart.addAxis(axis_y,Qt.AlignmentFlag.AlignLeft)
        lseries.attachAxis(axis_y)
        #设置图表
        chart.setTitle("商品按月份销售数据分析")
        chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
        chart.setTheme(QChart.ChartTheme.ChartThemeLight)
        #用chartView显示图表
        chartView=QChartView(chart)
        chartView.setRenderHint(QPainter.RenderHint.Antialiasing)
        self.layout2=QGridLayout(self.frmMonth)
        self.layout2.addWidget(chartView)

4 完整代码

# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: SaleAnalysis.py
Description:
Author: lzq
date:2024-08-08 11:09
------------------------------------------------
"""
import sys
from datetime import datetime

import openpyxl
from PyQt6.QtCharts import QPieSeries, QChart, QChartView, QBarSeries, QLineSeries, QBarSet, QBarCategoryAxis, \
    QValueAxis
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QIcon, QPen, QPainter, QColor
from PyQt6.QtPrintSupport import QPrintPreviewDialog
from PyQt6.QtWidgets import QGridLayout, QApplication

from pyqt6Learn.myNetShop.ui.SaleAnalysis_ui import Ui_MainWindow

saledata=[]
typeset={}
month=['01','02','03','04','05','05','05','08','09','10','11','12']
money_m=[0.00 for i in range(12)] #各月份对应的金额列表

class SaleWindow(Ui_MainWindow):
    def __init__(self):
        super(SaleWindow, self).__init__()
        self.setupUi(self)
        self.initUi()
    def initUi(self):
        self.setWindowIcon(QIcon('image/netshop.png'))
        self.setWindowFlag(Qt.WindowType.MSWindowsFixedSizeDialogHint)
        self.pbPrint.clicked.connect(self.printFigure)
        self.createData()
        self.analyByType()
        self.analyByMonth()

    #构造销售数据功能函数
    def createData(self):
        global saledata, typeset, money_m
        book=openpyxl.load_workbook(r'data/netshop.xlsx')
        sheet1=book['订单项表']
        sheet2=book['订单表']
        sheet3=book['商品表']
        sheet4=book['商品分类表']
        #1 从订单项表中读取所有状态为结算的记录
        r=0
        for cell_status in tuple(sheet1.columns)[3][1:]:
            r += 1
            if cell_status.value == '结算':
                orderitem=[cell.value for cell in tuple(sheet1.rows)[r]]
                #[订单号,商品号,数量,价格,金额,类别,月份]
                saleitem=[orderitem[0],orderitem[1],orderitem[2],0.00,0.00,'','']
                saledata.append(saleitem)
        #2 由每一项saleitem 的商品号在商品表中查出价格,算出金额,查出类别编号,再根据类别编号到商品分类表中查出大类名称,写入saledata[]
        for k, saleitem in enumerate(saledata):
            n = 0
            for cell_pid in tuple(sheet3.columns)[0][1:]:
                n += 1
                if cell_pid.value == saleitem[1]:
                    commodity=[cell.value for cell in tuple(sheet3.rows)[n]]
                    #写价格、金额
                    saleitem[3]=commodity[3]
                    saleitem[4]=saleitem[3]*saleitem[2]
                    #写类别
                    tid=commodity[1][0]
                    i=0
                    for cell_tid in tuple(sheet4.columns)[0][1:]:
                        i+=1
                        if cell_tid.value ==eval(tid):
                            tname=[cell.value for cell in tuple(sheet4.rows)[i]]
                            saleitem[5] = tname[1]
                            break
                    break
        #3 由每一项saleitem的订单号到订单表中查出下单时间,截取月份字段,写入saledata[]
        for k, saleitem in enumerate(saledata):
            n = 0
            for cell_oid in tuple(sheet2.columns)[0][1:]:
                n += 1
                if cell_oid.value == saleitem[0]:
                    order = [cell.value for cell in tuple(sheet2.rows)[n]]
                    #写月份
                    print(order[3])
                    saleitem[6]=str(order[3])[5:7]
                    break
        #按类别统计
        for saleitem in saledata:
            typeset[saleitem[5]] = typeset.get(saleitem[5], 0)+ saleitem[4]
        typeset = dict(sorted(typeset.items(), key=lambda x:x[1],reverse=True))
        # 按月份统计
        for saleitem in saledata:
            money_m[eval(saleitem[6].lstrip('0'))-1] += saleitem[4]
    #按类别功能函数
    def analyByType(self):
        #创建QPieSeries对象,用来存放饼图的数据
        pseries=QPieSeries()
        for item in typeset.items():
            pseries.append(item[0], item[1])
        slice=pseries.slices()[0]
        slice.setExploded(True)
        slice.setLabelVisible(True)
        slice.setPen(QPen(Qt.GlobalColor.red,2))
        slice.setBrush(Qt.GlobalColor.red)

        #创建QChart实例
        chart=QChart()
        chart.addSeries(pseries)
        chart.createDefaultAxes()
        #设置图表
        chart.setTitle("商品按类别销售数据分析")
        #动画效果
        chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignmentFlag.AlignBottom)
        #2显示图表
        chartView=QChartView(chart)
        #绘制平滑
        chartView.setRenderHint(QPainter.RenderHint.Antialiasing)
        self.layout1=QGridLayout(self.frmType)
        self.layout1.addWidget(chartView)
    #按月份
    def analyByMonth(self):
        bseries=QBarSeries()
        lseries=QLineSeries()
        #添加数据
        monthset=QBarSet('')
        for i in range(0,12):
            monthset << money_m[i]
            lseries.append(i, money_m[i])
        bseries.append(monthset)
        lseries.setColor(QColor(255,0,0))
        #创建QChart实例
        chart=QChart()
        #不显示图例
        chart.legend().hide()
        chart.addSeries(bseries)
        chart.addSeries(lseries)
        #设置坐标
        axis_x=QBarCategoryAxis()
        axis_x.setTitleText('月份')
        axis_x.append(month)
        chart.addAxis(axis_x,Qt.AlignmentFlag.AlignBottom)
        lseries.attachAxis(axis_x)
        axis_y=QValueAxis()
        axis_y.setTitleText('金额(元)')
        axis_y.setLabelFormat("%d")
        chart.addAxis(axis_y,Qt.AlignmentFlag.AlignLeft)
        lseries.attachAxis(axis_y)
        #设置图表
        chart.setTitle("商品按月份销售数据分析")
        chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
        chart.setTheme(QChart.ChartTheme.ChartThemeLight)
        #用chartView显示图表
        chartView=QChartView(chart)
        chartView.setRenderHint(QPainter.RenderHint.Antialiasing)
        self.layout2=QGridLayout(self.frmMonth)
        self.layout2.addWidget(chartView)

    #打印
    def printFigure(self):
        dlg=QPrintPreviewDialog()
        dlg.paintRequested.connect(self.handlePrint)
        dlg.exec()
    #执行打印
    def handlePrint(self, printer):
        painter=QPainter(printer)
        if self.tabWidget.currentIndex() == 0:
            screen=self.frmType.grab()
        else:
            screen=self.frmMonth.grab()
        painter.drawPixmap(180,50,screen)
        time_print = datetime.now()
        painter.drawText(100+self.frmType.width() -70, 50 + self.frmType.height()+30, datetime.strftime(time_print,'%Y-%m-%d %H:%M:$S'))

# if __name__=='__main__':
#     app=QApplication(sys.argv)
#     mainwindow=SaleWindow()
#     mainwindow.show()
#     sys.exit(app.exec())

PyQt学习暂时结束,看到这里代表你已出师!加油骚年

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机视觉与视觉大模型对板书检测效果对比

文章目录 计算机视觉火山引擎ocr阿里云ocr 视觉大模型GPT4kimi通义千问chatGLM百度 全部正确某开源模型&#xff0c;效果不佳 计算机视觉 火山引擎ocr 阿里云ocr 视觉大模型 GPT4 kimi 通义千问 chatGLM 百度 全部正确 某开源模型&#xff0c;效果不佳

基于springboot的养老院管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的养老院管理系统拥有多种角色账号&#xff1a;管理员和用户 管理员&#xff1a;管理员管理、用户管理、健康管理、病例方案管理、药品管理、餐饮管理、外出管理、入住管理…

汇编

汇编指令 随机数mov指令mov指令ldr指令&#xff08;伪指令&#xff09;add指令sub指令bic指令orr指令b指令cmp指令stmfd指令ldmfd指令import栈汇编指令的s后缀 随机数 1.如果某个数的数值范围是0~255之间&#xff0c;那么这个数一定是立即数&#xff1b; 2.把某个数展开成2进制…

树与图的宽度优先遍历

大致思想请参照添加链接描述该篇博客 主要地方的差异就是&#xff1a; 宽度优先遍历就是一层一层的搜索 图中数的层次题目 给定一个 n个点 m条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1号点到 n号点的…

C++风格指南 2、作用域

2.1. 命名空间 这段文字的关键内容概括如下&#xff1a; 1. 命名空间的使用&#xff1a;除了少数特殊情况外&#xff0c;代码应在命名空间内&#xff0c;命名空间名称应唯一&#xff0c;包含项目名和可选的文件路径。 2. 禁止使用&#xff1a; - using 指令引入整个命名空…

实验17:直流电机实验

硬件接线图; 我这里实现的是&#xff1a;转5s&#xff0c;停5s&#xff0c;循环 main.c #include<reg52.h>typedef unsigned int u16; typedef unsigned char u8;sbit ZLP1^0;void delay_10us(u16 n) {while(n--); }void delay_ms(u16 ms) {u16 i,j;for(ims;i>0;i--…

Python中8个让你成为调试高手的技巧

文末赠免费精品编程资料~~ 调试技能是每一位开发者不可或缺的利器。它不仅能帮你迅速定位并解决代码中的bug&#xff0c;还能提升你的编程效率&#xff0c;让你的代码更加健壮。今天&#xff0c;我们就来揭秘10个让你从新手进阶为调试高手的秘诀。 1. 使用print()函数——基础…

AIoTedge边缘物联网平台发布,更低的价格,更强大的功能

AIoTedge是一个创新的AI边缘计算平台&#xff0c;专为满足现代物联网&#xff08;IoT&#xff09;需求而设计。它采用了边云协同的架构&#xff0c;能够实现多点部署&#xff0c;并与IoT云平台无缝配合&#xff0c;提供分布式的AIoT处理能力。这种设计特别适合需要AI云端训练和…

高效率伪原创检测,6款工具为你轻松搞定

在内容创作领域&#xff0c;原创性是衡量作品价值的重要标准之一。然而&#xff0c;创作高质量的原创内容不仅需要灵感和创意&#xff0c;还需要大量的时间和精力。为了提高效率&#xff0c;许多创作者和编辑开始寻求伪原创检测工具的帮助&#xff0c;以确保他们的作品在保持独…

pat1097链表去重 | pat1133链表元素分类 【完结】

pat1097链表去重 与之前不同的是&#xff0c;需要把删掉的元素也拍成一个链表 分类讨论你就好好的分 如果重复了——pre不动&#xff0c;pre的next指向cur的next&#xff0c;然后在已删除中加上一个节点&#xff0c;状态移至下个节点&#xff08;最后完了记得加上-1&#xf…

C语言05--指针初识

内存地址 字节&#xff1a;字节是内存的容量单位&#xff0c;英文称为 byte&#xff0c;一个字节有8位&#xff0c;即 1byte 8bits地址&#xff1a;系统为了便于区分每一个字节而对它们逐一进行的编号&#xff0c;称为内存地址&#xff0c;简称地址。注:地址是按字节编号的&a…

多模态YOLOv8 融合可见光+红外光(RGB+IR)双输入【附代码】

文章目录 前言视频效果代码获取文章概述必要环境一、模型训练1、 定义数据1.1、数据集结构1.2、定义data.yaml 2、 运行方法运行效果 二、模型验证运行方法运行效果 三、模型推理1. 参数定义2. 运行方法运行效果 四、效果展示白天夜间 总结 前言 最近看不少朋友提到双模态YOLO…

基于SpringBoot的健康饮食管理系统---附源码98382

目 录 1 绪论 1.1 研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程…

什么是营销自动化?营销自动化的优势?

在SaaS行业和软件行业中&#xff0c;营销自动化作为一种先进的营销手段&#xff0c;正逐渐受到企业的青睐。营销自动化基于大数据和人工智能技术&#xff0c;能够自动执行、管理和完成营销任务和流程&#xff0c;为企业带来诸多优势。 营销自动化是一种能够一体化执行、管理、…

SecretPixel:一款整合了多种技术的高级图像隐写工具

关于SecretPixel SecretPixel是一款先进的隐写术工具&#xff0c;旨在安全地隐藏图像中的敏感信息。它结合了先进的加密、压缩和种子最低有效位 (LSB) 技术&#xff0c;为隐藏数据提供了一种不可检测的强大解决方案&#xff0c;在数字隐写术领域脱颖而出。 功能介绍 1、高级加…

2024 Python3.10 系统入门+进阶(七):字符串及其常用操作详解上篇

目录 一、初始化二、索引三、常用操作3.1 拼接字符串3.1.1 ""号3.1.2 join()方法 3.2 检索字符串3.2.1 find() 方法——字符串首次出现的索引位置(rfind()、index()、rindex())3.2.2 count() 方法——统计字符串出现次数3.2.3 len() 函数——计算字符串长度或元素个数…

RabbitMQ的高可用

1.Rabbit集群 采用集群模式保护消息的完整。 1.1普通集群 在普通集群模式下&#xff0c;各个节点之间有相同的元数据&#xff0c;即队列结构&#xff0c;而消息不会冗余&#xff08;不同节点的消息不同&#xff09;。 消费时&#xff0c;如果消费的不是存有数据的节点&…

如何用Python进行民宿数据分析:一步步教你实现可视化

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

基于swifter多内核的加速Pandas DataFrame操作运行

swifter是提高pandas性能的第三方包,主要是apply函数。 接口支持范围: 运行环境和安装 操作系统是Win10 64,pandas版本是2.2.2,swifter版本是1.4.0。 pip安装 $ pip install -U pandas # upgrade pandas $ pip install swifter # first time installation $ pip inst…

Android 架构模式之 MVVM

Android 架构 Android 架构模式之 MVCAndroid 架构模式之 MVPAndroid 架构模式之 MVVM 目录 Android 架构架构设计的目的对 MVVM 的理解代码ModelViewViewModel Android 中 MVVM 的问题试吃个小李子BeanModelViewViewModel效果展示 大家好&#xff01; 作为 Android 程序猿&a…