[英]How to get value from tkinter entry box and use it in Pandas
我正在嘗試開發一種工具來過濾大型 csv 文件,其中 tkinter 和 pandas 在 ZA7F5F35426B563821B563821 中。 這是我的代碼:
# %%
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()
我不知道為什么,但是 output xlsx 文件里面什么都沒有。 如果我手動將相同的過濾器放入 Excel 中,則有一些 output。 我想這可能是 textvariable 沒有從條目中獲得價值。
.get()
function 不是條目的動態鏈接,您必須再次調用它才能提取當時條目中的任何內容。 除此之外,我可能會建議您稍微重寫您的代碼,因為它使用了很多全局變量並且可以使用面向 object 的方法。 此外,您通常應避免將 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.