这是一个使用tkinter作为窗体界面,结合pandas进行编程的示例。
1.库
import os
import pandas as pd
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog as fd
2.Pandas制作的def
- pandas的处理流程定义为def。 用tkinter的filedialog的askopenfilename获得文件路径;
- 用os的os.path.abspath(os.path.join(file, “…”))获得被选择的文件的路径;
- tkinter和pandas之间连接的关键:.get(),比如下面代码的eintrag1.get(),表示从名为eintrag1的entry组件获得值,从而支持pandas进行处理;
- .unique()取得唯一值,唯一值来自eintrag2.get();
- 用『for i in lst:』和『df2 = df[df[eintrag2.get()].str.contains(i)]』分配到每一sheet;
- 导出和保存:『df2.to_excel(writer,i,index=False)』和『writer.save()』
def 处理():
Datei = fd.askopenfilename(
title='选择',
filetypes=[
("Excel files","*.xls"),
("Excel files",".xlsx"),
("Excel files","*.xlsm"),
]) # 获取文件路径,通过中括号包含了三种excel文件格式
weg=os.path.abspath(os.path.join(Datei, "..")) # 获取文件夹路径:被选择的文件的路径
df = pd.read_excel(Datei,sheet_name=eintrag1.get()) #Pandas读取窗体界面的指定页
writer = pd.ExcelWriter(weg +'\\'+eintrag1.get() +'.xlsx')#生成以页(sheet)命名的xlsx文件
lst = df[eintrag2.get()].unique() #取唯一值
for i in lst:
df2 = df[df[eintrag2.get()].str.contains(i)] #分配到每一sheet
df2.to_excel(writer,i,index=False)
writer.save()
os.system(weg +'\\'+eintrag1.get() +'.xlsx') #导出后方便立即查看
3.Tkinter窗体的设定
创建窗体之后,标签(label)、输入(entry)和按钮(botton)都用grid定位
##### 创建root窗体
root = tk.Tk()
root.title('按列分sheet')
root.resizable(False, False)
root.geometry('280x90+630+420') # (宽度x高度)+(x轴+y轴)
宽度=9
高度=25
左右內距=8
上下內距=5
左右间距=5
上下间距=5
##### 页entry
## 页entry label 创建
lb_eintrag1 = tk.Label(root,width =宽度,padx=左右间距,pady=上下间距,text="页")
lb_eintrag1.grid(column=0,row=0, sticky="e")
eintrag1 = ttk.Entry(root,width = 宽度+3)
eintrag1.grid(column=1,row=0,padx=左右间距, sticky="w")
##### 列entry
## 列entry(eintrag) label 创建
lb_eintrag2 = tk.Label(root,width =宽度,padx=左右间距,pady=上下间距,text="列")
lb_eintrag2.grid(column=0,row=1, sticky="e")
eintrag2 = ttk.Entry(root,width = 宽度+3)
eintrag2.grid(column=1,row=1,padx=左右间距, sticky="w")
##### 处理 button
taste = ttk.Button(root,text='处理',width = 宽度,command=处理) #commdand引用def『处理』
taste.grid(column=3, row=0, rowspan=4, ipadx=5, ipady=10, padx=左右间距, sticky="e")
##### 应用的运行
root.mainloop()
4.完整代码
import os
import pandas as pd
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog as fd
def 处理():
Datei = fd.askopenfilename(
title='选择',
filetypes=[
("Excel files","*.xls"),
("Excel files",".xlsx"),
("Excel files","*.xlsm"),
]) # 获取文件路径,通过中括号包含了三种excel文件格式
weg=os.path.abspath(os.path.join(Datei, "..")) # 获取文件夹路径:被选择的文件的路径
df = pd.read_excel(Datei,sheet_name=eintrag1.get()) #Pandas读取窗体界面的指定页
writer = pd.ExcelWriter(weg +'\\'+eintrag1.get() +'.xlsx')#生成以页(sheet)命名的xlsx文件
lst = df[eintrag2.get()].unique() #取唯一值
for i in lst:
df2 = df[df[eintrag2.get()].str.contains(i)] #分配到每一sheet
df2.to_excel(writer,i,index=False)
writer.save()
os.system(weg +'\\'+eintrag1.get() +'.xlsx') #导出后方便立即查看
##### 创建root窗体
root = tk.Tk()
root.title('按列分sheet')
root.resizable(False, False)
root.geometry('280x90+630+420') # (宽度x高度)+(x轴+y轴)
宽度=9
高度=25
左右內距=8
上下內距=5
左右间距=5
上下间距=5
##### 页entry
## 页entry label 创建
lb_eintrag1 = tk.Label(root,width =宽度,padx=左右间距,pady=上下间距,text="页")
lb_eintrag1.grid(column=0,row=0, sticky="e")
eintrag1 = ttk.Entry(root,width = 宽度+3)
eintrag1.grid(column=1,row=0,padx=左右间距, sticky="w")
##### 列entry
## 列entry(eintrag) label 创建
lb_eintrag2 = tk.Label(root,width =宽度,padx=左右间距,pady=上下间距,text="列")
lb_eintrag2.grid(column=0,row=1, sticky="e")
eintrag2 = ttk.Entry(root,width = 宽度+3)
eintrag2.grid(column=1,row=1,padx=左右间距, sticky="w")
##### 处理 button
taste = ttk.Button(root,text='处理',width = 宽度,command=处理) #commdand引用def『处理』
taste.grid(column=3, row=0, rowspan=4, ipadx=5, ipady=10, padx=左右间距, sticky="e")
##### 应用的运行
root.mainloop()
双击后出现的界面