简体   繁体   中英

How to get value from tkinter entry box and use it in Pandas

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM