簡體   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