繁体   English   中英

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

[英]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.

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