我正在尝试开发一个工具,用Python中的tkinter和pandas过滤大型csv文件。下面是我的代码:
# %%
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()
我不知道为什么,但是输出的xlsx文件中没有任何内容。如果我手动将相同的过滤器放入Excel中,会有一些输出。我猜可能是text变量没有获得entry中的值。
发布于 2020-11-26 17:40:08
.get()
函数不是指向条目的动态链接,您必须再次调用它才能提取当时条目中的内容。除此之外,我可能会建议你重写一下代码,因为它使用了大量的全局变量,并且可以使用面向对象的方法。此外,通常应避免将tkinter名称空间直接导入到脚本中,因为这有时可能会导致名称冲突。相反,像import tkinter as tk
一样导入
尝试下面的脚本,
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()
https://stackoverflow.com/questions/65019099
复制相似问题