python 使用pyqt5实现了一个汽车配件记录系统

前言

老姐要求做个记录销售汽车配件得的excel,我觉得太麻烦了,身为程序员的我 必须安排一个方便快捷的系统,安排上!!!

环境要求:python3,pyqt5,pandas

1、实现效果

初始界面

b5f850f5b329435e871aed9624731d51.png

 添加界面

fc0cf94176864077a274791c5fd19578.png

2、代码实现

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import pandas as pd
import sys
import datetime
import os
from shutil import copyfileclass DataManage(QWidget):def __init__(self):super(DataManage, self).__init__()self.data_list = []self.base_path = r'C:\CarData'self.money_sum_text = '总金额:¥ 0.0'if not os.path.exists(self.base_path):os.mkdir(self.base_path)if not os.path.exists(self.base_path + '\data.xlsx'):file = open(self.base_path + '\data.xlsx', 'w')file.close()if os.path.exists(self.base_path + '\data.xlsx'):data = pd.read_excel(self.base_path + '\data.xlsx', dtype=str)self.money_sum_text = '总金额:¥{}'.format(str(data['销售金额'][:-1].astype(dtype='float').sum()))self.data_list = data.iloc[0:-1,:].values.tolist()self.init_ui()def init_ui(self):'''全局设置'''self.setWindowIcon(QIcon('i.ico'))self.setWindowTitle('汽车配件记录系统')self.resize(726, 440)grid = QGridLayout()'''菜单设置'''self.add_btn = QPushButton()self.add_btn.setText('添加数据')self.add_btn.setStyleSheet("background-color:#1890ff;color:white;border:none;font: 15px \"微软雅黑\";")self.add_btn.setFixedSize(100,30)self.add_btn.clicked.connect(self.add_btn_click)self.del_btn = QPushButton()self.del_btn.setText('删除数据')self.del_btn.setStyleSheet("background-color:#ff4949;color:white;border:none;font: 15px \"微软雅黑\";")self.del_btn.setFixedSize(100,30)self.del_btn.clicked.connect(self.del_data_row)self.query_btn = QPushButton()self.query_btn.setText('查询')self.query_btn.setStyleSheet("background-color:#1890ff;color:white;border:none;font: 15px \"微软雅黑\";")self.query_btn.setFixedSize(100,30)self.query_btn.clicked.connect(self.query_data_list)self.saveData_btn = QPushButton()self.saveData_btn.setText('打开文件')self.saveData_btn.setStyleSheet("background-color:#13ce66;color:white;border:none;font: 15px \"微软雅黑\";")self.saveData_btn.setFixedSize(100,30)self.saveData_btn.clicked.connect(self.saveData_data_click)self.money_sum = QLabel()self.money_sum.setText(self.money_sum_text)'''数据列表设置'''self.data_table = QTableWidget()self.data_table.setStyleSheet("QHeaderView::section{background-color:#DCDCDC;border:1px solid #D3D3D3;font: 15px \"微软雅黑\";}")COLUMN = 7ROW = 0self.data_table.setColumnCount(COLUMN)self.data_table.setRowCount(ROW)h_table_header = ['序号', '车型', '配件名称', '规格', '单价', '数量','销售金额']self.data_table.setHorizontalHeaderLabels(h_table_header)self.data_table.horizontalHeader().setDefaultAlignment(Qt.AlignVCenter)self.data_table.verticalHeader().setVisible(False)self.data_table.setShowGrid(True)self.data_table.setEditTriggers(QTableWidget.NoEditTriggers)self.data_table.setSelectionBehavior(QTableWidget.SelectRows)self.data_table.setSelectionMode(QTableWidget.SingleSelection)for index in range(self.data_table.columnCount()):headItem = self.data_table.horizontalHeaderItem(index)headItem.setTextAlignment(Qt.AlignVCenter)'''加入布局'''grid.addWidget(self.add_btn, 0, 0, 1, 1)grid.addWidget(self.del_btn, 0, 1, 1, 1)#grid.addWidget(self.query_btn, 0, 2, 1, 1)grid.addWidget(self.saveData_btn, 0, 2, 1, 1)grid.addWidget(self.money_sum, 0, 3, 1, 1)grid.addWidget(self.data_table, 1, 0, 1, 4)grid.setSpacing(12)self.setLayout(grid)# 初始化数据self.query_data_list()# 将新增数据的按钮绑定到该槽函数def add_btn_click(self):'''打开新增数据的弹框模块:return:'''try:AddDialog.get_add_dialog(self)self.refsh_data()except PermissionError:#reply = QMessageBox.critical(self, '标题', '严重错误对话框消息正文', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)QMessageBox.critical(self, "错误", "Excel文件正在打开,请关闭文件后操作!")except:QMessageBox.critical(self, "错误", "操作异常!")# 将查询数据的按钮绑定到该槽函数def query_data_list(self):'''查询数据、并将数据展示到主窗口的数据列表中:return:'''data = self.data_listif len(data) != 0 and len(data[0]) != 0:self.data_table.setRowCount(len(data))self.data_table.setColumnCount(len(data[0]))for i in range(len(data)):for j in range(len(data[0])):self.data_table.setItem(i, j, QTableWidgetItem(str(data[i][j])))# 将删除数据按钮绑定到该槽函数def del_data_row(self):'''删除某一行的数据信息:return:'''try:row_select = self.data_table.selectedItems()if len(row_select) != 0:row = row_select[0].row()self.data_table.removeRow(row)del self.data_list[row]self.refsh_data()except PermissionError:#reply = QMessageBox.critical(self, '标题', '严重错误对话框消息正文', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)QMessageBox.critical(self, "错误", "Excel文件正在打开,请关闭文件后操作!")except:QMessageBox.critical(self, "错误", "操作异常!")# 刷新数据到文件def refsh_data(self):'''将数据更新到文件:return:'''df = pd.DataFrame(self.data_list, columns=['序号', '车型', '配件名称', '规格', '单价', '数量','销售金额'])df['单价'].astype('float')df['数量'].astype('int')df['销售金额'].astype('float')# 保存到本地excelpath = r'C:\CarData'if not os.path.exists(path):os.mkdir(r'C:\CarData')file_name = "C:\CarData\data.xlsx"if len(self.data_list) > 0: writer = pd.ExcelWriter(file_name, engine='xlsxwriter')df.to_excel(writer, sheet_name='Sheet1', index=False)workbook  = writer.bookworksheet = writer.sheets['Sheet1']header_format = workbook.add_format({'bold': True,                          # 字体加粗'text_wrap': True,                     # 是否自动换行'valign': 'bottom',                    # 垂直对齐方式'align': 'center',                     # 水平对齐方式'border': 1,                           # 边框'top':1,                               # 上边框 'left':1,                              # 左边框'right':1,                             # 右边框'bottom':1,                            # 底边框})sumMoney = 0.0for i in df['销售金额']:sumMoney += float(i)worksheet.write_string(len(self.data_list) + 1, 6, u'总金额:{}'.format(sumMoney))writer.save()writer.close()self.money_sum.setText('总金额:¥{}'.format(sumMoney))else:os.remove(file_name)self.money_sum.setText('总金额:¥0.0')# 打开文件def saveData_data_click(self):'''打开文件:return:'''if len(self.data_list) > 0:df = pd.DataFrame(self.data_list, columns=['序号', '车型', '配件名称', '规格', '单价', '数量','销售金额'])df['单价'].astype('float')df['数量'].astype('int')df['销售金额'].astype('float')try:# 保存到文件中file_name = "C:\CarData\data.xlsx"if not os.path.exists(r'C:\CarData\copy'):os.mkdir(r'C:\CarData\copy')copyfile(file_name, "C:\CarData\copy\data_copy.xlsx")if not os.path.exists(file_name):QMessageBox.critical(self, "错误", "数据存储路径不存在,请重启系统!")os.startfile("C:\CarData\copy\data_copy.xlsx")except PermissionError:#reply = QMessageBox.critical(self, '标题', '严重错误对话框消息正文', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)QMessageBox.critical(self, "错误", "Excel文件正在打开,请关闭文件后操作!")except:QMessageBox.critical(self, "错误", "操作异常!")else:QMessageBox.critical(self, "错误", "数据为空!")
class AddDialog(QDialog):def __init__(self, parent=None):super(AddDialog, self).__init__(parent)self.init_ui(parent)def init_ui(self,parent):self.setWindowTitle('添加界面')self.resize(400, 200)'''水平布局'''hbox = QHBoxLayout()self.save_btn = QPushButton()self.save_btn.setText('保存')self.save_btn.setStyleSheet("background-color:#1890ff;color:white;border:none;")self.save_btn.setFixedSize(200,30)self.save_btn.clicked.connect(lambda :self.save_btn_click(parent))self.cancel_btn = QPushButton()self.cancel_btn.setText('取消')self.cancel_btn.setFixedSize(200,30)self.cancel_btn.clicked.connect(self.cancel_btn_click)hbox.addWidget(self.save_btn)hbox.addWidget(self.cancel_btn)hbox.setSpacing(12)'''校验器'''self.intvalidator  = QIntValidator()self.doublevalidator = QDoubleValidator()self.doublevalidator.setDecimals(2)'''表单布局'''fbox = QFormLayout()self.seq_lab = QLabel()self.seq_lab.setText('序号:')self.seq_lab.setStyleSheet("font: 15px \"微软雅黑\";")self.seq_text = QLineEdit()self.seq_text.setFixedHeight(30)self.seq_text.setValidator(self.intvalidator)self.seq_text.setPlaceholderText('请输入序号')self.name_lab = QLabel()self.name_lab.setText('车型:')self.name_lab.setStyleSheet("font: 15px \"微软雅黑\";")self.name_text = QLineEdit()self.name_text.setFixedHeight(30)self.name_text.setPlaceholderText('请输入车型')self.age_lab = QLabel()self.age_lab.setText('配件名称:')self.age_lab.setStyleSheet("font: 15px \"微软雅黑\";")self.age_text = QLineEdit()self.age_text.setFixedHeight(30)self.age_text.setPlaceholderText('请输入配件名称')self.class_lab = QLabel()self.class_lab.setText('规格:')self.class_lab.setStyleSheet("font: 15px \"微软雅黑\";")self.class_text = QLineEdit()self.class_text.setFixedHeight(30)self.class_text.setPlaceholderText('请输入规格')self.socre_lab = QLabel()self.socre_lab.setText('单价:')self.socre_lab.setStyleSheet("font: 15px \"微软雅黑\";")self.socre_text = QLineEdit()self.socre_text.setFixedHeight(30)self.socre_text.setValidator(self.doublevalidator)self.socre_text.setPlaceholderText('请输入单价')self.num_lab = QLabel()self.num_lab.setText('数量:')self.num_lab.setStyleSheet("font: 15px \"微软雅黑\";")self.num_text = QLineEdit()self.num_text.setFixedHeight(30)self.num_text.setValidator(self.intvalidator)self.num_text.setPlaceholderText('请输入数量')self.money_lab = QLabel()self.money_lab.setText('销售金额:')self.money_lab.setStyleSheet("font: 15px \"微软雅黑\";")self.money_text = QLineEdit()self.money_text.setFixedHeight(30)self.money_text.setValidator(self.doublevalidator)self.money_text.setPlaceholderText('请输入销售金额')fbox.addRow(self.seq_lab,self.seq_text)fbox.addRow(self.name_lab, self.name_text)fbox.addRow(self.age_lab, self.age_text)fbox.addRow(self.class_lab, self.class_text)fbox.addRow(self.socre_lab, self.socre_text)fbox.addRow(self.num_lab, self.num_text)fbox.addRow(self.money_lab, self.money_text)fbox.setSpacing(12)vbox = QVBoxLayout()vbox.addLayout(fbox)vbox.addLayout(hbox)self.setLayout(vbox)def save_btn_click(self,parent):if self.seq_text.text().strip() != '' and self.name_text.text().strip() != '' \and self.age_text.text().strip() != ''and self.class_text.text().strip() != '' \and self.socre_text.text().strip() != '' and self.num_text.text().strip() != '' \and self.money_text.text().strip() != '':data = [self.seq_text.text(),self.name_text.text(),self.age_text.text(),self.class_text.text(),self.socre_text.text(),self.num_text.text(),self.money_text.text()]parent.data_list.append(data)parent.query_data_list()self.close()def cancel_btn_click(self):self.close()@staticmethoddef get_add_dialog(parent=None):dialog = AddDialog(parent)return dialog.exec()if __name__ == '__main__':app = QApplication(sys.argv)main = DataManage()main.show()sys.exit(app.exec_())

 3、pyinstaller打包成exe

pyinstaller -F -w main.py --icon=i.ico

 

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

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

相关文章

基于JavaEE的汽车配件管理系统_JSP网站设计_SqlServer数据库设计

目 录 摘要1 Abstract2 1、引言3 1.1 课题背景3 1.2 国内外研究现状3 1.3 课题目的5 1.4 课题意义5 1.5 需要解决的问题5 1.6 可行性研究6 1.6.1 经济可行性6 1.6.2 技术可行性6 1.6.3运行可行性7 1.6.4 时间可行性7 1.6.5 法律可行性7 2、相关技术简介7 2.…

Java、JSP汽车4S店配件销售系统的设计

技术:Java、JSP等 摘要:随着汽车产业的蓬勃发展汽配行业也取得了极大地进步,但是当前大部分的汽车配件行业是靠手工操作来进行货物管理。当汽车的品种不断出新,配件的种类也不断增多,只靠人工操作已经不能满足实际情况…

easyui 文本框 显示提示信息data-options=prompt:'格式:水箱支架-京东汽配店铺-图集(大图/图集6)'...

<tr><td>图集6:</td><td><input class"easyui-textbox" data-options"prompt:格式&#xff1a;水箱支架-京东汽配店铺-图集(大图/图集6)" type"text" id"GoodsPicc5Name" name"GoodsPicc5Name" …

IT论坛测试

目录 一、项目介绍 项目名称 项目简介 相关技术 项目展示 二 、测试用例设计和功能测试 测试用例设计 注册页面 登陆页面 首页面 发布帖子页面 修改个人信息页面 功能测试 注册页面 登录页面 首页面 发布帖子页面 修改个人信息页面 三、接口测试 1.Junit单…

性能测试流程? 怎么做性能测试?

一、前期准备 性能测试虽然是核心功能稳定后才开始压测&#xff0c;但是在需求阶段就应该参与&#xff0c;这样可以深入了解系统业务、重要功能的业务逻辑&#xff0c;为后续做准备。 二、性能需求分析&#xff08;评审&#xff09; 评审时&#xff0c;要明确性能测试范围、目…

泽众AutoRunner软件的使用方法,以测试win10环境下系统自带的计算器为例

准备工作&#xff1a; 系统&#xff1a;Win10 测试的软件&#xff1a;Win10自带的计算器 本文中AutoRunner软件的下载地址&#xff1a;https://dl.pconline.com.cn/download/1592874-1.html?qq-pf-topcqq.group &#xff08;大家也可以在泽众的官网下载&#xff0c;这个是我随…

【Android入门01】教你从0开发一个计算器软件——say No to “Hello world”,say Hi to Calculator

本文会手把手教你如何从0搭建一个系统自带的计算器应用。 前言 计算器应用只是一个普通的系统原生应用&#xff0c;并不设计数据库、网络交互的内容&#xff0c;也不需要使用MVVM等设计模式和高级的Jetpack组件。只要搞清界面设计和运算逻辑两部分&#xff0c;任何人都可以轻…

php 经纬度范围计算器,经纬度距离角度计算器|经纬度距离角度计算器(geography)下载v2.1 免费版 - 欧普软件下载...

经纬度距离角度计算器是一款简单好用的计算器软件&#xff0c;可以根据开始点、参考点、结束点、距离输出、角度输出等参数计算出两点距离和三点夹角&#xff0c;计算速度快&#xff0c;准确率高&#xff0c;需要的朋友可以来本站下载&#xff01; 经纬度距离角度计算器安装教程…

android中倒计时计算器,死亡计算器生命倒计时下载-死亡计算器生命倒计时软件下载 v8.8.0_5577安卓网...

死亡计算器生命倒计时下载分享给大家。火爆全抖音的生命倒计时&#xff0c;年龄计算器、死亡计算器、倒计时生日提醒等功能。通过精确到小数点的数据来告知人们珍惜时间的重要性&#xff01; 【软件说明】 人生在世三万天&#xff0c;好好珍惜每一刻的时光。独特功能&#xff1…

Linux(多进程与多线程)

目录 1、进程与线程概念 1.1 进程 1.2 线程 1.3 进程与线程区别 2、多进程 2.1多进程概念 2.2 进程相关API 2.3 多进程编程 3、多线程 3.1 多线程概念 3.2 多线程相关API 3.3 多线程编程 1、进程与线程概念 1.1 进程 在计算机科学中&#xff0c;进程是正在执行中…

虚拟机搭建集群

基于3台虚拟机搭建集群架构图 1.服务器准备 使用VMware Workstation虚拟机创建虚拟服务器来搭建集群&#xff0c;所用软件及版本如下&#xff1a; VMware Workstation 12.0 CentOS-6.5-64bit 2.基础虚拟机安装 2.1新建虚拟机&#xff08;虚拟硬件&#xff09; 关键步骤&a…

【web集群简介-01】

文章目录 一、web服务基础二、集群简介 一、web服务基础 web服务器HTTP基本原理 web服务基础HTTP 1.URL / URI URL全称为Uniform Resource Location&#xff0c;统一资源定位符 URI全称为Uniform Resource Identifier&#xff0c;统一资源标识符 URN:统一资源名称 (Uniform Re…

什么是虚拟计算机集群

这个问题来自近期几位网友的私信&#xff0c;他们不约而同问到一个问题&#xff1a;什么是虚拟计算机集群&#xff1f;Laxcus分布式操作系统是如何做的&#xff1f;下面就正式回答一下这个问题。 在我们传统的认知里&#xff0c;或者大家平常比较多接触的&#xff0c;都…

Linux下的5款主流高可用集群软件介绍

Linux集群主要分成三大类:高可用集群(High Availability Cluster)、负载均衡集群(Load Balance Cluster)、科学计算集群(High Performance Computing Cluster)。 其中高可用集群具有保障应用程序持续提供服务的能力,可以将因软、硬件、人为造成的故障对业务的影响降低到最小…

高可用 - 01 闲聊高性能集群

文章目录 什么是集群集群的特点与功能1. 高可用性与可扩展性2. 负载均衡与错误恢复3. 心跳监测与漂移IP地址 集群的分类1. 高可用集群高可用的概念常见的HA集群双机冷备双机热备双机互备多机互备 高可用集群软件 2. 负载均衡集群3. 分布式计算集群 HA集群中的相关术语1&#xf…

常见集群(Cluster)软件和技术解析

集群就是通过软件将一组服务器作为一个整体向客户提供资源。这些单个的服务器就是集群的节点。当对外提供资源的节点故障后&#xff0c;集群中其余的节点能够将资源接管起来&#xff0c;继续对客户提供资源。 集群技术的核心就是资源访问控制。由于集群中所有节点都可以访问集群…

[Linux基础与服务管理——常用集群高可用软件 Keepalived]

1.Keepalived 简介 Keepalived是Linux下的一个免费的、轻量级的高可用解决方案。是一个由C语言编写的路由软件&#xff0c;主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载平衡和高可用性设。Keepalived实现了一组检查器&#xff0c;以根据其健康状况动态地和…

集群分为几种,用的软件分别是什么?

集群分为几种&#xff0c;用的软件分别是什么? 补充&#xff1a;涉及的组件 1.1、apache 跨平台的网页服务器&#xff0c;主要使用它做静态资源服务器&#xff0c;也可以做代理服务器转发请求 1.2、ngnix 高性能的 HTTP和反向代理服务器&#xff0c;ngnix处理能力相当于apache…

轻量级集群管理软件-Ansible

ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成&#xff0c;类似于saltstack和Puppet&#xff0c;但是有一个不同和优点是我们不需要在节点中安装任何客户端 , 它使用SSH来和节点进行通信 Ansible基于 Pytho…

了解集群、集群的分类、常用的集群软硬件及选型介绍(内附详细图解)

Table of Contents 一、集群简介 二、集群的七大优点 三、集群的分类 四、常用的集群软硬件及选型介绍 一、集群简介 集群就是一组&#xff08;若干个&#xff09;相互独立的计算机&#xff0c;利用高速通信网络组成的一个较大的计算机服务系统&#xff0c;每个集群节点&…