简体   繁体   English

如何从 tkinter 输入框中获取价值并在 Pandas 中使用它

[英]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.我正在尝试开发一种工具来过滤大型 csv 文件,其中 tkinter 和 pandas 在 ZA7F5F35426B563821B563821 中。 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.我不知道为什么,但是 output xlsx 文件里面什么都没有。 If I put the same filters in Excel manually and there is something output.如果我手动将相同的过滤器放入 Excel 中,则有一些 output。 I guess it was probably the textvariable didn't achieve the value from entry.我想这可能是 textvariable 没有从条目中获得价值。

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. .get() function 不是条目的动态链接,您必须再次调用它才能提取当时条目中的任何内容。 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.除此之外,我可能会建议您稍微重写您的代码,因为它使用了很多全局变量并且可以使用面向 object 的方法。 Also, you should generally avoid importing the tkinter namespace directly into your script, as it could sometimes cause name conflicts.此外,您通常应避免将 tkinter 命名空间直接导入脚本,因为它有时会导致名称冲突。 Instead import like import tkinter as tk而是像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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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