太强了!Python 开发桌面小工具,让代码替我们干重复的工作!
The following article is from 杰哥的IT之旅 Author Cherish
作者 | Cherish
来源 | 杰哥的IT之旅
决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python 自动生成透视表",这个问题背后有个非常好的解决思路,让代码替我们做重复的工作,从而减轻工作量,减少出错。
Python 开发的小工具实际上是将 Python 程序打包成 exe,分享即可用,即便电脑没有安装 Python 环境,也可以使用,用代码提高工作效率,尽量少加班。
内容大纲
明确需求:自动生成透视表【这部分可以换成你的重复性工作】
安装三方依赖库:tkinter 和 pyinstaller
代码实现:包括两部分 Python 生成透视表和桌面 GUI 联动设计
打包 Python 程序 生成 exe 可执行文件
解决 exe 文件可能过大问题:安装虚拟环境
需求背景
安装三方依赖库
使用 pyinsatller 将程序打包成 exe,好处是不需要将代码部署到服务器,直接将打包好的 exe 发给对方,就能直接使用,对于这种小而轻的功能非常友好。
pip install pyinstaller
代码实现
import numpy as np
class ExcelToPivot(object):
def __init__(self, filename, file_path):
self.file_name = filename
self.file_path = file_path
"""
excel自动转透视表功能
返回透视结果
"""
def excel_Pivot(self):
print(self.file_path)
data = pd.read_excel(self.file_path)
data_pivot_table = pd.pivot_table(data, index=['供应商名称', '月份'], values=["入库金额"], aggfunc=np.sum)
return data_pivot_table
"""
按条件筛选,并保存
"""
def select_data(self, name, month):
data_pivot_table = self.excel_Pivot()
data_new = data_pivot_table.query('供应商名称 == ["{}"] & 月份 == {}'.format(name, month))
data_new.to_excel('{}.xlsx'.format(str(self.file_name).split('.')[0]))
return '筛选完成!'
if __name__ == '__main__':
filename = input("请输入文件名字:")
path = 'C:/Users/cherich/Desktop/' + filename
pross = ExcelToPivot(filename, path)
print(pross.select_data("C", 4))
import tkinter.filedialog
import excel_to_pivot
from tkinter import messagebox
from tkinter import ttk
def Upload():
global filename, data_pivot_table
try:
filename = tkinter.filedialog.askopenfilename(title='选择文件')
pross = excel_to_pivot.ExcelToPivot(str(filename).split('/')[-1], filename)
data_pivot_table = pross.excel_Pivot()
messagebox.showinfo('Info', '转换成功!')
except Exception as e:
print(e)
messagebox.showinfo('Info', '转换失败!')
def select(name, month):
try:
print('供应商名称 == ["{}"] & 月份 == {}'.format(name, month))
data_new = data_pivot_table.query('供应商名称 == ["{}"] & 月份 == {}'.format(name, month))
data_new.to_excel('{}.xlsx'.format(str(filename).split('.')[0]))
messagebox.showinfo('Info', '筛选完成并生成文件!')
root.destroy()
except Exception as e:
print(e)
messagebox.showinfo('Info', '筛选失败!')
root = Tk()
root.config(background="#6fb765")
root.title('自动转透视表小工具')
root.geometry('500x250')
e1 = Entry(root, width=30)
e1.grid(row=2, column=0)
btn1 = Button(root, text=' 上传文件 ', command=Upload).grid(row=2, column=10, pady=5)
box1 = ttk.Combobox(root)
# 使用 grid() 来控制控件的位置
box1.grid(row=5, sticky="NW")
# 设置下拉菜单中的值
box1['value'] = ('A', 'B', 'C', 'D', '供应商')
# 通过 current() 设置下拉菜单选项的默认值
box1.current(4)
box2 = ttk.Combobox(root)
box2.grid(row=5, column=1, sticky="NW")
box2['value'] = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, '月份')
box2.current(12)
# 编写回调函数,绑定执行事件
def func(event):
global b1, b2
b1 = box1.get()
b2 = box2.get()
# 绑定下拉菜单事件
box1.bind("<<ComboboxSelected>>", func)
box2.bind("<<ComboboxSelected>>", func)
btn2 = Button(root, text=' 筛选数据 ', command=lambda: select(b1, b2)).grid(row=30, column=10, pady=5)
mainloop()
打包 Python 程序生成 exe
-i 给应用程序添加图标 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项) -c –console, –nowindowed 使用控制台,无界面(默认) -w –windowed, –noconsole 使用窗口,无控制台 -p 添加搜索路径
解决 exe 文件可能过大问题
配置虚拟环境
pip install virtualenvwrapper-win
整个自动化思路的实现就完成了,大家可以将整个流程套用到你现有的重复性工作中,在过程中有两个需要注意的点,如下:
尽量不要用中文路径,要不会报些莫名其妙的错误。
导包是尽量避免使用 import * 导入不必要的包,节省打包和执行时间。
让代码自动工作,省下来的时间,摸摸鱼,打打小游戏不好么~
-------- End --------