Tkinter - 将 3 个用户输入变量传递给函数以通过 pandas 查询搜索 csv 文件

Tkinter - passing 3 user input variables to functions to search a csv file via a pandas query

我想做什么: 用户输入 csv 的文件路径、字段名称,然后是 keyword/phrase 并单击提交... .返回的是 pandas 查询的结果,该查询使用他们从他们想要使用的 csv 中读取的输入构建。

到目前为止我的代码:

# Relevant Python libraries:
import pandas as pd
import csv
import tkinter as tk
    
fieldname = tk.StringVar()
keyword = tk.StringVar()
csv_file_path = tk.StringVar() 

def import_csv_data(self):
    ?????
    ?????
    df = pd.dataframe(pd.read_csv(csv_file_path)) # not sure this is possible, need to define pandas dataframe somewhere? 

def search(self):
    print(df[df[fieldname.get()].str.contains(keyword.get()), na=False)] 

window = tk.Tk()
window.title("Search CSV")
frm_form = tk.Frame(relief=tk.SUNKEN, borderwidth=3)
frm_form.pack()
        
   labels = [
       "CSV File Path:",
       "Field Name:",
       "Keyword/Phrase:",
   ]
    
 # Loop over the list of field labels
 for idx, text in enumerate(labels):
       # Create a Label widget with the text from the labels list
       label = tk.Label(master=frm_form, text=text)
        
       # Create an Entry widget
       entry = tk.Entry(master=frm_form, width=50)
       # Use the grid geometry manager to place the Label and
       # Entry widgets in the row whose index is idx
       label.grid(row=idx, column=0, sticky="ew")
       entry.grid(row=idx, column=1, sticky="ew")
    
 frm_buttons = tk.Frame()
 frm_buttons.pack(fill=tk.X, ipadx=5, ipady=5)
    
 btn_submit = tk.Button(master=frm_buttons, 
                        text="Submit", variable = csv_file_path, fieldname, keyword ) # HELP?
                       #command=lambda:[import_csv_data(self), search(self)]) #define a function and 
                       # insert at top to pull from from CSV and call with "command", bind for simplicity

 btn_submit.pack(side=tk.RIGHT, padx=10, ipadx=10)
                           
 btn_clear = tk.Button(master=frm_buttons, text="Clear")
 btn_clear.pack(side=tk.RIGHT, ipadx=10)
    
 window.mainloop()

我被卡住的地方: 定义将完成工作的函数。我不知道如何布置它们。 因此,第一个函数是获取 csv 文件并传递到 pandas 数据帧中...

第二个函数将获取字段名称(列)和关键字并将其放入如下所示的内容中:

print(df[df["fieldnamehere"].str.contains("thisphraseorkeyword", na=False)]

目前我在网上查到的没有一个例子说明如何将输入信息输入到函数中。我一直在努力寻找这种情况,但没有任何运气。我没有找到一个部分的相关示例并将其变成我自己的技能,我还没有。我还观看了 senddex 的这个 YouTube 教程的前几部分,以帮助我走到这一步:https://www.youtube.com/watch?v=oV68QJJUXTU as did this RealPython tutorial: https://realpython.com/python-gui-tkinter/

这个答案似乎很有帮助,但不确定是否适用于此:

提问: 任何有关函数以及如何让用户输入 pandas 字符串的帮助,我们将不胜感激。我为函数编写的内容是一种猜测。 我不确定如何在函数中使用 get() 来确保它按预期执行。 我希望这个问题足够好,我已经编辑了一个小时,哈。

我相信你正在寻找这样的东西

def import_csv_data():
    df = pd.DataFrame(pd.read_csv(csv_file_path.get()))
    search(df)

def search(df):
    print(df[df[fieldname.get()].astype(str).str.contains(keyword.get())])

您需要在定义 tk.Tk 之后定义 StringVar,以便定义根。

window = tk.Tk()
window.title("Search CSV")
frm_form = tk.Frame(relief=tk.SUNKEN, borderwidth=3)
frm_form.pack()

csv_file_path = tk.StringVar() 
fieldname = tk.StringVar()
keyword = tk.StringVar()

由于您是在循环中创建 Entry 字段,因此您可以使用字典并分配 textvariable

labels = {
   "CSV File Path:":csv_file_path,
   "Field Name:":fieldname,
   "Keyword/Phrase:":keyword,
}
    
for idx, text in enumerate(labels.keys()):
    label = tk.Label(master=frm_form, text=text)
    entry = tk.Entry(master=frm_form, width=50, textvariable=labels[text])
    label.grid(row=idx, column=0, sticky="ew")
    entry.grid(row=idx, column=1, sticky="ew")

对于按钮,你可以简单地使用import_csv_data函数作为命令

btn_submit = tk.Button(master=frm_buttons, 
                    text="Submit",command=import_csv_data)