pyqt5写一个图形化的文本处理软件

参考资料https://www.zhihu.com/column/pyqt5

最终效果软件
在这里插入图片描述

导入安装包

pip install PyQt5 -i https://pypi.douban.com/simple
pip install PyQt5-tools -i https://pypi.douban.com/simple

要使用PyQt5编写一个文本处理程序,你可以按照以下步骤进行:

安装PyQt5:如果你还没有安装PyQt5,请使用pip安装它。打开命令提示符或终端窗口,然后运行以下命令:
shell

pip install PyQt5 -i https://pypi.douban.com/simple
pip uninstall PyQt5 
# 不要安装下面的
pip install PyQt5-tools -i https://pypi.douban.com/simple
pip uninstall PyQt5-tools
pip install --upgrade sip -i https://pypi.douban.com/simplepip install PyQt5 --use-feature=2020-resolver -i https://pypi.douban.com/simple
pip install --upgrade pyqt5-plugins -i https://pypi.douban.com/simple
pip install --upgrade sip -i https://pypi.douban.com/simple
pip install --upgrade pyqt5 -i https://pypi.douban.com/simple

创建主窗口:使用PyQt5创建一个主窗口,这将作为应用程序的入口点。你可以使用Qt Designer设计主窗口的界面,或者手动编写代码来创建窗口。
添加文本处理功能:根据你的需求,在主窗口中添加文本处理功能。这可能包括打开和保存文本文件、编辑文本、查找和替换文本、格式化文本等。你可以使用QTextEdit、QPlainTextEdit等控件来显示和编辑文本。
编写处理函数:为文本处理功能编写函数,以便在需要时执行。例如,你可以编写一个函数来查找文本中的特定字符串,并高亮显示它们。
连接信号和槽:在PyQt5中,信号和槽机制用于处理事件和消息。你可以将按钮的点击事件与相应的槽函数连接起来,以便在用户单击按钮时执行特定的操作。
运行应用程序:最后,运行应用程序并测试它是否按预期工作。你可以使用QApplication对象来运行应用程序,并使用主窗口对象显示它。

下面是一个简单的示例代码,演示如何使用PyQt5创建一个基本的文本处理程序:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QTextEdit, QVBoxLayout, QWidgetclass TextProcessor(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('Text Processor')self.setGeometry(300, 300, 300, 200)# 创建文本编辑器和按钮self.text_edit = QTextEdit(self)self.button = QPushButton('Process', self)self.button.clicked.connect(self.processText)# 创建垂直布局并将控件添加到布局中layout = QVBoxLayout()layout.addWidget(self.text_edit)layout.addWidget(self.button)# 创建容器并将布局添加到容器中container = QWidget()container.setLayout(layout)self.setCentralWidget(container)def processText(self):# 处理文本的代码将放在这里passif __name__ == '__main__':app = QApplication(sys.argv)processor = TextProcessor()processor.show()sys.exit(app.exec_())

在这个示例中,我们创建了一个名为TextProcessor的类,它继承自QMainWindow。我们创建了一个QTextEdit控件和一个QPushButton控件,并将它们添加到一个垂直布局中。我们还连接了按钮的点击事件与processText方法。processText方法将在用户单击按钮时被调用,你可以在这里编写处理文本的代码。最后,我们创建了一个QApplication对象并显示主窗口。

最终完整代码

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QFileDialog, QLabel, QLineEdit
from PyQt5.QtGui import QIcon
from openpyxl import load_workbook
from openpyxl.styles import *
import pandas as pd
import string
import os
from openpyxl import Workbookclass FileProcessor(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('冬装奖励处理')self.setWindowIcon(QIcon('icon.png'))  # 设置窗口图标,需要一个PNG格式的图标文件self.setGeometry(300, 300, 500, 200)  # 设置窗口位置和大小layout = QVBoxLayout()  # 创建垂直布局# 创建文件选择按钮和标签self.input_btn = QPushButton('选择文件')self.input_btn.clicked.connect(self.select_file)layout.addWidget(self.input_btn)self.input_label = QLabel('请选择文件')layout.addWidget(self.input_label)# 创建处理按钮和处理标签self.process_btn = QPushButton('处理文件')self.process_btn.clicked.connect(self.process_file)layout.addWidget(self.process_btn)self.process_label = QLabel('处理中...')layout.addWidget(self.process_label)# 创建输出标签和文件路径输入框self.output_label = QLabel('输出文件路径:')layout.addWidget(self.output_label)self.output_line = QLineEdit()layout.addWidget(self.output_line)# 将布局设置到窗口上self.setLayout(layout)self.show()def select_file(self):# 打开文件选择对话框,并获取选中的文件路径fname = QFileDialog.getOpenFileName(self, '打开文件', os.getcwd())[0]if fname:  # 如果用户选择了文件self.input_label.setText('已选择文件:' + fname)  # 更新标签显示选中的文件路径self.output_line.setText(fname)  # 将输出路径设置为选中的文件路径,这里仅作示例,实际上你可能需要生成一个新的文件名或目录结构def process_file(self):# 这里是处理文件的逻辑,例如读取选中的文件内容并保存到新的文件中。这里只是一个示例。selected_file = self.input_label.text().split(':')[1]  # 获取选中的文件路径(去掉“已选择文件:”文字)print(selected_file)parent_path = os.path.dirname(selected_file)file_path2 = parent_path + '/冬季奖励数据处理结果.xlsx'self.data_deal(selected_file)print(file_path2+'数据处理')self.style_deal(file_path2)print(file_path2 + '格式处理')self.process_label.setText('文件已处理!')  # 更新标签显示处理完成的信息(这里只是一个示例)self.output_line.setText(file_path2)  # 更新输出路径的显示(这里只是一个示例)@staticmethoddef create_excel(self, file_path):# 没有就创建if os.path.exists(file_path):print("文件已存在")print(file_path)else:# 创建一个新的 Excel 文件wb = Workbook()wb.save(file_path)@staticmethoddef set_cell_style(self, ws):# 边框border = Border(left=Side(border_style='thin', color='000000'),right=Side(border_style='thin', color='000000'),top=Side(border_style='thin', color='000000'),bottom=Side(border_style='thin', color='000000'),)# 对齐alignment = Alignment(horizontal='center',vertical='center',text_rotation=0,indent=0)# 字体font = Font(name='微软雅黑',size=11,bold=False,italic=False,strike=False,color='000000')rows = ws.max_row  # 获取最大行columns = ws.max_column  # 获取最大列# 遍历表格内容,注意:openpyxl下标是从1开始for i in range(1, rows + 1):for j in range(1, columns + 1):# 设置边框ws.cell(i, j).border = border# 设置居中对齐ws.cell(i, j).alignment = alignment# 设置字体ws.cell(i, j).font = fontreturn ws@staticmethoddef number_to_column(self, n):"""Convert a number to the corresponding column letter in Excel"""column = ""while n > 0:n -= 1column = string.ascii_uppercase[n % 26] + columnn //= 26return column@staticmethoddef auto_col_width(self, ws):lks = []  # 英文变量太费劲,用汉语首字拼音代替for i in range(1, ws.max_column + 1):  # 每列循环lk = 1  # 定义初始列宽,并在每个行循环完成后重置for j in range(1, ws.max_row + 1):  # 每行循环sz = ws.cell(row=j, column=i).value  # 每个单元格内容if isinstance(sz, str):  # 中文占用多个字节,需要分开处理lk1 = len(sz.encode('gbk'))  # gbk解码一个中文两字节,utf-8一个中文三字节,gbk合适else:lk1 = len(str(sz))if lk < lk1:lk = lk1  # 借助每行循环将最大值存入lk中# print(lk)lks.append(lk)  # 将每列最大宽度加入列表。(犯了一个错,用lks = lks.append(lk)报错,append会修改列表变量,返回值none,而none不能继续用append方法)# 第二步:设置列宽for i in range(1, ws.max_column + 1):k = self.number_to_column(i)  # 将数字转化为列名,26个字母以内也可以用[chr(i).upper() for i in range(97, 123)],不用导入模块ws.column_dimensions[k].width = lks[i - 1] + 2  # 设置列宽,一般加两个字节宽度,可以根据实际情况灵活调整return ws@staticmethoddef sheet_name_deal(self, file_path):wb = load_workbook(file_path)# 获取sheet页,修改第一个sheet页面名为销售明细name1 = wb.sheetnames[0]ws1 = wb[name1]ws1.title = "销售明细"wb.save(file_path)# 首行@staticmethoddef style_deal(self, file_path1):wb = load_workbook(file_path1)name_list = wb.sheetnamesfor name in name_list:ws = wb[name]self.set_cell_style(ws)# 自适应列宽self.auto_col_width(ws)wb.save(file_path1)@staticmethoddef data_deal(self, file_path1):# 使用os.path.dirname()获取父路径parent_path = os.path.dirname(file_path1)file_path2 = parent_path+'/冬季奖励数据处理结果.xlsx'self.sheet_name_deal(file_path1)self.create_excel(file_path2)# 读入数据df1 = pd.read_excel(file_path1, sheet_name='销售明细')df2 = df1[df1['季节名称'] == '冬'].copy()# 筛选品类category_list = ['大衣', '派克服', '皮毛一体', '皮羽绒', '羽绒服', '麂皮绒', '坎毛', '水貂派克服', '雪兰貂']# 字典category_dict = dict(zip(category_list, [True] * len(category_list)))df2 = df2.loc[df2['品类名称'].isin(category_list), :]# 修改直销价为浮点类型df2['直销价'] = df2['直销价'].astype('float')# 单价在500元以上 1000元以下的衣服df3 = df2[(df2['直销价'] >= 500) & (df2['直销价'] < 1000)].copy()# 单价在1000元以上的衣服df4 = df2[df2['直销价'] >= 1000].copy()# 500-1000部门商店品类销售数量index_list = ['日期', '部门名称', '商店名称', '品类名称']value_list = ['销售数量']df31 = df3.pivot_table(index=index_list, values=value_list, aggfunc='sum')df31['提成金额'] = df31['销售数量'] * 50df31 = df31.reset_index()# 部门客户销售数量index_list = ['日期', '部门名称', '商店名称']value_list = ['销售数量']df32 = df3.pivot_table(index=index_list, values=value_list, aggfunc='sum')df32['提成金额'] = df32['销售数量'] * 50df32 = df32.reset_index()# 1000元以上部门商店品类销售数量index_list = ['日期', '部门名称', '商店名称', '品类名称']value_list = ['销售数量']df41 = df4.pivot_table(index=index_list, values=value_list, aggfunc='sum')df41['提成金额'] = df41['销售数量'] * 100df41 = df41.reset_index()# 部门客户销售数量index_list = ['日期', '部门名称', '商店名称']value_list = ['销售数量']df42 = df4.pivot_table(index=index_list, values=value_list, aggfunc='sum')df42['提成金额'] = df42['销售数量'] * 100df42 = df42.reset_index()# 部门品类销售数量df51 = df31.copy()df52 = df41.copy()df51['500元档位数量'] = df51.pop('销售数量')df52['1000元档位数量'] = df52.pop('销售数量')index_list = ['部门名称', '品类名称']value_list = ['500元档位数量']df511 = df51.pivot_table(index=index_list, values=value_list, aggfunc='sum')value_list = ['1000元档位数量']df521 = df52.pivot_table(index=index_list, values=value_list, aggfunc='sum')df53 = pd.merge(df511, df521, how='outer', left_index=True, right_index=True)df54 = df53.reset_index()df54 = df54.fillna(0)# 日期部门客户大类备注df60 = df2.copy()df61 = df60[df60['直销价'] >= 500]index_list = ['日期', '部门名称', '商店名称']column_list = ['品类名称']# value_list = ['销售数量']df666 = df61.pivot_table(index=index_list, columns=column_list, values='销售数量', aggfunc='sum')df666 = df666.reset_index()# 生成备注列notes_list = []# 获取列名start_len = len(index_list)column_list = df666.columns.tolist()df666 = df666.fillna(0)for row in df666.itertuples():strings = ''for pos in range(start_len, len(column_list)):col_name = column_list[pos]num = getattr(row, col_name)num = int(num)if num != 0:strings = strings + str(num) + '件' + col_name + ','# 切片操作strings = strings[:-1] + ""  # 将最后一个字符替换为空notes_list.append(strings)# 删除品类列sum_len = len(column_list)df667 = df666.copy()for pos in range(start_len, sum_len):col_name = column_list[pos]df667.pop(col_name)df667['备注'] = pd.Series(notes_list)# 获取部门客户品类df71 = df31.copy()df72 = df41.copy()df71['500元档位数量'] = df71.pop('销售数量')df72['1000元档位数量'] = df72.pop('销售数量')index_list = ['日期', '部门名称', '商店名称']value_list = ['500元档位数量']df711 = df71.pivot_table(index=index_list, values=value_list, aggfunc='sum')value_list = ['1000元档位数量']df721 = df72.pivot_table(index=index_list, values=value_list, aggfunc='sum')df73 = pd.merge(df711, df721, how='outer', left_index=True, right_index=True)df74 = df73.reset_index()df74 = df74.fillna(0)df74['总奖励金额'] = df74['500元档位数量'] * 50 + df74['1000元档位数量'] * 100df75 = pd.merge(df74, df667, how='left')wb = load_workbook(file_path2)# 获取sheet页,修改第一个sheet页面为name1 = wb.sheetnames[0]ws1 = wb[name1]ws1.title = "500-1000冬装销售明细"# 创建工作表wb.create_sheet("500-1000客户品类销售")wb.create_sheet("500-1000客户销售")wb.create_sheet("1000以上冬装销售明细")wb.create_sheet("1000以上客户品类销售")wb.create_sheet("1000以上客户销售")wb.create_sheet("部门品类销售")wb.create_sheet("部门客户品类销售")wb.create_sheet("部门客户销售备注")wb.create_sheet("部门客户档位销售")wb.save(file_path2)# 将生成的工作表导入到程序中result_sheet = pd.ExcelWriter(file_path2, engine='openpyxl')  # 先定义要存入的文件名xxx,然后分别存入xxx下不同的sheet# df1将0转变为空df3.to_excel(result_sheet, "500-1000冬装销售明细", index=False, na_rep=0, inf_rep=0)df31.to_excel(result_sheet, "500-1000客户品类销售", index=False, na_rep=0, inf_rep=0)df32.to_excel(result_sheet, "500-1000客户销售", index=False, na_rep=0, inf_rep=0)df4.to_excel(result_sheet, "1000以上冬装销售明细", index=False, na_rep=0, inf_rep=0)df41.to_excel(result_sheet, "1000以上客户品类销售", index=False, na_rep=0, inf_rep=0)df42.to_excel(result_sheet, "1000以上客户销售", index=False, na_rep=0, inf_rep=0)df54.to_excel(result_sheet, "部门品类销售", index=False, na_rep=0, inf_rep=0)df666.to_excel(result_sheet, "部门客户品类销售", index=False, na_rep=0, inf_rep=0)df667.to_excel(result_sheet, "部门客户销售备注", index=False, na_rep=0, inf_rep=0)df75.to_excel(result_sheet, "客户档位销售", index=False, na_rep=0, inf_rep=0)# 这步不能省,否则不生成文件result_sheet._save()if __name__ == '__main__':app = QApplication(sys.argv)processor = FileProcessor()processor.show()sys.exit(app.exec_())

打包成exe软件

安装依赖

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

使用pyinstaller将py文件打包为exe

1.打开对应py文件,在Terminal终端,输入:pyinstaller -F -w ’文件名‘.py

pyinstaller -F -w 文件处理.py

生成的exe文件位置在哪里?

打包后的exe文件在项目的dist目录下:

最终效果
在这里插入图片描述

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

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

相关文章

【C语言】linux内核ipoib模块 - ipoib_send

一、ipoib_send函数定义 int ipoib_send(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_tx_buf *tx_req;int hlen, rc;void *phead;unsigned int usable_sge priv->max_sen…

基于python socket实现TCP/UDP通信

两个应用程序如果需要进行通讯最基本的一个前提就是能够唯一的标示一个进程&#xff0c;我们知道IP层的ip地址可以唯一标示主机&#xff0c;而TCP层协议和端口号可以唯一标示主机的一个进程&#xff0c;这样我们可以利用ip地址&#xff0b;协议&#xff0b;端口号唯一标示网络中…

使用 crypto-js 进行 AES 加解密操作

在前端开发中&#xff0c;数据的加密和解密是为了保障用户隐私和数据的安全性而常见的任务。AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称密钥加密算法&#xff0c;被广泛用于保护敏感信息的传输和存储。本文将介绍 AES 加解密的基本原理&#xff0c;并…

寒假思维训练计划day11

每日一题&#xff0c;这两天有事&#xff0c;断更了一天&#xff0c;今天补上&#xff0c;感觉状态也不太好&#xff0c;来道1500的题压压惊。 宣传一下我总结的几个构造题模型&#xff0c;一点个人的浅薄见解&#xff1a; 1、前后缀贪心&#xff0c;比如说观察前后缀的sum&…

RK3568平台 LT9211转接芯片调试笔记

一.简介 龙讯LT9211是一个高性能转换器&#xff0c;支持MIPI LVDS TTL两两之间转换。 使用此款芯片大部分为MIPI与LVDS进行互相转换。 下图为LT9211的典型应用图&#xff1a; 二.LT9211原理图 三.车载显示器和摄像头系统 四.调试LT9211输出 MIPI数据 &#xff08;1&#xf…

web系统设计安全性基本要求

接口设计安全 身份鉴别 独立的登录模块&#xff1a;为社会用户和平台运营管理用户提供独立的登录地址、登录界面和身份认证模块&#xff0c;通过防火墙等设备严格限制能够登录WEB应用的用户地址、身份&#xff1b; 双因素认证&#xff1a; 平台运营管理人员&#xff1a;采用用…

Civil 3D安装教程,免费使用,带安装包和工具,一分钟轻松搞的安装

前言 Civil 3D是一款面向基础设施行业的建筑信息模型&#xff08;BIM&#xff09;解决方案。它为基础设施行业的各类技术人员提供了强大的设计、分析以及文档编制功能&#xff0c;广泛适用于勘察测绘、岩土工程、交通运输、水利水电、市政给排水、城市规划和总图设计等众多领域…

MySQL(五)——多表查询

上期文章 MySQL&#xff08;四&#xff09;——约束 文章目录 上期文章多表关系一对多&#xff08;多对一&#xff09;多对多多表外键关系可视化一对一 多表查询概述笛卡尔积多表查询分类连接查询 内连接隐式内连接显式内连接 外连接左外连接右外连接 自连接联合查询 union&am…

Android Framework | AOSP源码下载及编译指南(基于Android13)

Android Framework | AOSP源码下载及编译指南(基于Android13) 引言 AOSP&#xff08;Android Open Source Project&#xff09;是Android操作系统的开源项目&#xff0c;通过下载和编译AOSP源码&#xff0c;您可以获得原始的Android系统&#xff0c;并进行定制和开发。本教程…

【C++】—— C++的IO流

在C中&#xff0c;I/O流是一项关键的编程概念&#xff0c;为程序提供了与外部世界进行交互的重要手段。通过使用C的强大I/O库&#xff0c;开发者能够实现对标准输入输出、文件、字符串等多种数据源的高效处理。接下来让我们深入探讨C的I/O流&#xff0c;了解其基本原理、常见操…

浏览器插件:WebScraper基本用法和抓取页面内容(不会编程也能爬取数据)

Web Scraper 是一个浏览器扩展&#xff0c;用于从页面中提取数据(网页爬虫)。对于简单或偶然的需求非常有用&#xff0c;例如正在写代码缺少一些示例数据&#xff0c;使用此插件可以很快从类似的网站提取内容作为模拟数据。从 Chrome 的插件市场安装后&#xff0c;页面 F12 打开…

RT-Thread experimental 代码学习(1)thread_sample

RTOS的最基础功能是线程。 线程的调度是如何工作的&#xff1f;RT-thread官方的实验文档是最好的参考。 老规矩&#xff0c;先放法国人doxygen。 thread_sample 代码的调用关系图 有意思的是&#xff0c;RT有两种创建线程的方式 - 静态和动态&#xff0c;粗略的理解是&…

微信小程序之WXML 模板语法之数据绑定、事件绑定、wx:if和列表渲染

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

数字图像处理期末速成笔记

目录 一、基础知识二、相邻像素间基本关系三、图像增强方法1、直方图求解2、直方图均衡化3、直方图规定化4、图像平滑5、邻域平均法&#xff08;线性&#xff09;6、 中值滤波法&#xff08;分线性&#xff09;7、中值滤波与领域平均的异同8、4-邻域平滑法9、超限像素平滑法10、…

我们应该了解的⽤户画像

当我们谈⽤户画像时&#xff0c;到底在谈什么 对于互联⽹公司来说&#xff0c;企业的增⻓、内容、活动、产品等⼯作基本上都是围绕着“⽤户”来做的&#xff0c;可以说都是在做“⽤户运营”这个⼯作&#xff0c;⽽⽤户画像是⽤户运营⼯作中⾮常重要的⼀环 ⽤户画像的主要特征是…

【js】js 异步机制详解 Generator / Async / Promise

三种语法功能放在一起&#xff0c;是因为他们都有相似特点&#xff1a; 维护某种状态在未来恢复状态并执行 本文重点回答以下几个问题&#xff1a; 为什么 Generator 和 Async 函数的 代码执行流 都可以简化成树形结构&#xff1f;async 函数为什么返回一个 promise&#xf…

Cloudreve存储策略-通过从机存储来拓展容量

Sham的云服务器是搬瓦工最低低低配的&#xff0c;1H 0.5G不说&#xff0c;硬盘容量也只有10g&#xff0c;说实话&#xff0c;装了宝塔面板和服务器套件后&#xff0c;基本满了&#xff0c;这时又想在云服务器上打个网盘用于下载、存储&#xff0c;这时就需要拓展硬盘&#xff0…

【podman】podman学习

Podman 官网 快速开始 面向 Docker 用户的 Podman 和 Buildah Podman是一个开源的容器、pod和容器映像管理引擎。Podman使查找、运行、构建和共享容器变得容易。 Podman Desktop是Podman的图形应用程序&#xff0c;使其易于在Windows、MacOS和Linux上安装和使用Podman&…

烟火检测AI边缘计算智能分析网关V4如何通过ssh进行服务器远程运维

智能分析网关V4是一款高性能、低功耗的AI边缘计算硬件设备&#xff0c;它采用了BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;并且INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;每个摄像头可同时配置3种算法&…

Fiddler基础使用指南

1. Fiddler介绍 Fiddler 是一款抓包工具&#xff0c;可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作&#xff0c;也可以用来检测网络安全 2. 设置过滤 通过设置过滤条件&#xff0c;可以使抓包工具过滤掉非目标包 3. 删除数据 被抓取的包可以进行手动删除 …