Python Tkinter-将3个用户输入变量传递给函数,以通过查询搜索csv文件
我想做什么:用户输入csv的文件路径、字段名,然后输入关键字/短语,然后单击提交……返回的是使用他们的输入构建的查询结果,该查询从他们想要使用的csv中读取 到目前为止我的代码:Python Tkinter-将3个用户输入变量传递给函数,以通过查询搜索csv文件,python,python-3.x,pandas,tkinter,tkinter-entry,Python,Python 3.x,Pandas,Tkinter,Tkinter Entry,我想做什么:用户输入csv的文件路径、字段名,然后输入关键字/短语,然后单击提交……返回的是使用他们的输入构建的查询结果,该查询从他们想要使用的csv中读取 到目前为止我的代码: # Relevant Python libraries: import pandas as pd import csv import tkinter as tk fieldname = tk.StringVar() keyword = tk.StringVar() csv_file_path = tk.Str
# 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文件并传递到数据帧中
第二个函数将获取字段名(列)和关键字,并将其放入如下内容:
print(df[df["fieldnamehere"].str.contains("thisphraseorkeyword", na=False)]
到目前为止,我在网上找到的还没有关于如何将输入信息输入函数的示例。我一直在努力寻找这种情况,没有任何运气。我没有能力为一个部分找到相关的例子,并把它变成我自己的,我还没有。我还观看了sentdex编写的YouTube教程的前几个部分,以帮助我做到这一点:正如RealPython教程:
这个答案似乎很有用,但不一定适用于这里:
询问:非常感谢您对这些功能的任何帮助以及如何将用户输入到熊猫字符串中。我所写的函数只是一种猜测。
我不知道如何在函数中使用get()来确保它执行预期的操作。
我希望这个问题足够好,我已经编辑了一个小时了,哈。我相信你正在寻找这样的问题
def import_csv_data():
df=pd.DataFrame(pd.read\u csv(csv\u file\u path.get())
搜索(df)
def搜索(df):
打印(df[df[fieldname.get()].astype(str.str.contains(keyword.get())]))
在定义tk.tk
之后,需要定义StringVar
s,以便定义根
window=tk.tk()
窗口标题(“搜索CSV”)
frm_form=tk.框架(浮雕=tk.凹陷,边框宽度=3)
frm_表单包()
csv_file_path=tk.StringVar()
fieldname=tk.StringVar()
关键字=tk.StringVar()
由于要在循环中创建条目
字段,因此可以使用字典并分配文本变量
标签={
“CSV文件路径:”:CSV文件路径,
“字段名:”:字段名,
关键字/短语:“:关键字,
}
对于idx,枚举中的文本(labels.keys()):
标签=tk.标签(主标签=frm\u表格,文本=text)
entry=tk.entry(master=frm_form,width=50,textvariable=labels[text])
label.grid(行=idx,列=0,sticky=“ew”)
entry.grid(行=idx,列=1,sticky=“ew”)
对于按钮,您只需使用import\u csv\u data
功能作为命令
btn_submit=tk.按钮(master=frm_按钮,
text=“Submit”,command=import\u csv\u数据)
在调用搜索功能的导入csv\u数据功能中是否为“搜索(df)”?search
功能在导入csv\u数据的外部定义。在import\u csv\u data
函数中,定义了df
,然后通过调用search(df)
将其传递给search
函数。这有助于回答你的问题吗?是的。另一个问题是要将结果打印到csv,以及在笔记本中,我尝试了def save(df):df.to_csv('jira_request.csv',index=False)
,但它似乎不会将文件保存在任何地方,如果其他人打开并在他们的机器上运行它,那么定义桌面位置将不起作用。是否也可以有csv输出?该文件将保存在与脚本相同的目录中。您确定没有保存任何文件吗?这个函数返回什么os.path.isfile('jira\u request.csv')
?它返回false。我也以管理员的身份运行jupyter。