I am trying to develop a tool in filtering large csv file with tkinter and pandas in Python. Here is my code:
# %%
from tkinter import *
from tkinter import filedialog
import pandas as pd
root = Tk()
# %%
root.title('Test')
root.geometry("+400+280")
# filter1
label1 = Label(root, text='营运处: ', font=('宋体',10))
label1.grid(row=0,column=0)
var1 = StringVar()
entry1 = Entry(root, show=None, textvariable=var1, font=('宋体',10))
entry1.grid(row=0,column=1)
area_str = entry1.get()
area_list = area_str.split(' ')
# filter2
label2 = Label(root, text='采销部: ', font=('宋体',10))
label2.grid(row=1,column=0)
var2 = StringVar()
entry2 = Entry(root, show=None, textvariable=var2, font=('宋体',10))
entry2.grid(row=1,column=1)
dept_str = var2.get()
dept_list = dept_str.split(' ')
# filter3
label3 = Label(root, text='品牌标识: ', font=('宋体',10))
label3.grid(row=2,column=0)
var3 = StringVar()
entry3 = Entry(root, show=None, textvariable=var3, font=('宋体',10))
entry3.grid(row=2,column=1)
brd_id = var3.get()
# %%
def select_file():
global filename
filename = filedialog.askopenfilename(
filetype=(('csv files','*.csv'),('all files','*.*'))
)
return filename
def save_file():
filepath = filedialog.asksaveasfilename()
return filepath
def query():
global dfa
df = pd.read_csv(r'%s'%(select_file()), dtype='str')
df.rename(columns={'x.ekgnam':'dept'}, inplace=True)
filter1 = df.zdiqu.isin(area_list)
filter2 = df.dept.isin(dept_list)
filter3 = df['brand_id']==brd_id
dfa = df[filter1 & filter2 &filter3]
def output():
dfa.to_excel(r'%s'%(save_file()),index=False)
# %%
button1 = Button(root, text='选择文件执行查询', font=('宋体',10), command=query)
button1.grid(row=4,column=0)
button2 = Button(root, text='查询结果导出', font=('宋体',10), command=output)
button2.grid(row=4,column=1)
button3 = Button(root, text='完成', font=('宋体',10), command=root.quit)
button3.grid(row=4,column=2)
# run
root.mainloop()
I don't know why but the output xlsx file has nothing in there. If I put the same filters in Excel manually and there is something output. I guess it was probably the textvariable didn't achieve the value from entry.
the .get()
function is not a dynamic link to the entry, you would have to call it again to extract whatever is in the entry at the time. Aside of that, I would probably suggest you rewrite your code a bit, since it uses a lot of globals and could make use of an object oriented approach. Also, you should generally avoid importing the tkinter namespace directly into your script, as it could sometimes cause name conflicts. Instead import like import tkinter as tk
Try the script below,
import tkinter as tk
from tkinter import filedialog
import pandas as pd
class FileSelector:
def __init__(self):
self.root = tk.Tk()
self.root.title('Test')
self.root.geometry('+400+280')
self.var1 = tk.StringVar()
self.var2 = tk.StringVar()
self.var3 = tk.StringVar()
self.make_widgets()
# run
self.root.mainloop()
def make_widgets(self):
# filter1
tk.Label(self.root, text='营运处: ', font=('宋体',10)).grid(row=0,column=0)
tk.Entry(self.root, show=None, textvariable=self.var1, font=('宋体',10)).grid(row=0,column=1)
# filter2
tk.Label(self.root, text='采销部: ', font=('宋体',10)).grid(row=1,column=0)
tk.Entry(self.root, show=None, textvariable=self.var2, font=('宋体',10)).grid(row=1,column=1)
# filter3
tk.Label(self.root, text='品牌标识: ', font=('宋体',10)).grid(row=2,column=0)
tk.Entry(self.root, show=None, textvariable=self.var3, font=('宋体',10)).grid(row=2,column=1)
# buttons
tk.Button(self.root, text='选择文件执行查询', font=('宋体', 10), command=self.query).grid(row=4, column=0)
tk.Button(self.root, text='查询结果导出', font=('宋体', 10), command=self.output).grid(row=4, column=1)
tk.Button(self.root, text='完成', font=('宋体', 10), command=self.root.quit).grid(row=4, column=2)
@staticmethod
def select_file():
filename = filedialog.askopenfilename(
filetype=(('csv files','*.csv'),('all files','*.*'))
)
return filename
@staticmethod
def save_file():
filepath = filedialog.asksaveasfilename()
return filepath
def query(self):
df = pd.read_csv(r'%s'%(self.select_file()), dtype='str')
df.rename(columns={'x.ekgnam':'dept'}, inplace=True)
area_list = self.var1.get().split(' ')
dept_list = self.var2.get().split(' ')
brd_id = self.var3.get()
filter1 = df.zdiqu.isin(area_list)
filter2 = df.dept.isin(dept_list)
filter3 = df['brand_id'] == brd_id
return df[filter1 & filter2 & filter3]
def output(self):
dfa = self.query()
dfa.to_excel(r'%s'%(self.save_file()),index=False)
FileSelector()
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.