Lorsque j'utilise DataFrame, il y a des situations dans lesquelles je souhaite pouvoir le rechercher et l'afficher. Il est particulièrement utile lors de la création d'applications GUI. Je voudrais rechercher Pandas DataFrame ci-dessous et créer un formulaire de recherche à afficher à l'aide de Tkinter.
import pandas as pd
import tkinter as tk
import tkinter.ttk as ttk
class SearchWindow(tk.Frame):
def __init__(self, master=None, parent=None):
super().__init__(master)
self.master = master
self.master.geometry("300x300")
self.master.title("Fenêtre de recherche")
self.pack()
self.set_data()
self.create_widgets()
def set_data(self):
self.data = pd.read_csv("data.csv", encoding="utf-8")
self.colname_list = ["Code alimentaire", "Nom de l'aliment"] #Nom de la colonne à afficher dans les résultats de recherche
self.width_list = [100, 200]
self.search_col = "Mot-clé de recherche" # Mot-clé de rechercheの入力されている列名
def create_widgets(self):
self.pw_main = ttk.PanedWindow(self.master, orient="vertical")
self.pw_main.pack(expand=True, fill=tk.BOTH, side="left")
self.pw_top = ttk.PanedWindow(self.pw_main, orient="horizontal", height=25)
self.pw_main.add(self.pw_top)
self.pw_bottom = ttk.PanedWindow(self.pw_main, orient="vertical")
self.pw_main.add(self.pw_bottom)
self.creat_input_frame(self.pw_top)
self.create_tree(self.pw_bottom)
def creat_input_frame(self, parent):
fm_input = ttk.Frame(parent, )
parent.add(fm_input)
lbl_keyword = ttk.Label(fm_input, text="mot-clé", width=7)
lbl_keyword.grid(row=1, column=1, padx=2, pady=2)
self.keyword = tk.StringVar()
ent_keyword = ttk.Entry(fm_input, justify="left", textvariable=self.keyword)
ent_keyword.grid(row=1, column=2, padx=2, pady=2)
ent_keyword.bind("<Return>", self.search)
def create_tree(self, parent):
self.result_text = tk.StringVar()
lbl_result = ttk.Label(parent, textvariable=self.result_text)
parent.add(lbl_result)
self.tree = ttk.Treeview(parent)
self.tree["column"] = self.colname_list
self.tree["show"] = "headings"
self.tree.bind("<Double-1>", self.onDuble)
for i, (colname, width) in enumerate(zip(self.colname_list, self.width_list)):
self.tree.heading(i, text=colname)
self.tree.column(i, width=width)
parent.add(self.tree)
def search(self, event=None):
keyword = self.keyword.get()
result = self.data[self.data[self.search_col].str.contains(keyword, na=False)]
self.update_tree_by_search_result(result)
def update_tree_by_search_result(self, result):
self.tree.delete(*self.tree.get_children())
self.result_text.set(f"Résultats de recherche:{len(result)}")
for _, row in result.iterrows():
self.tree.insert("", "end", values=row[self.colname_list].to_list())
def onDuble(self, event):
for item in self.tree.selection():
print(self.tree.item(item)["values"])
def main():
root = tk.Tk()
app = SearchWindow(master=root)
app.mainloop()
if __name__ == "__main__":
main()
Le contenu du CSV en cours de lecture est le suivant. :
Code de l'aliment Nom de l'aliment Mot-clé de recherche
0 1001 Amaranthus / Véritable Amaranthus / Véritable Amaransasu
1 1002 Awa / grain blanc Awa / grain blanc Awa
2 1003 Awa / Awamochi Awa / Awamochi Awamochi
3 1004 Enbaku / Otomeal Enbaku / Otomeal Enbaku Otomiru Oto Otsu
4 1005 Orge / Oshimugi avec sept minutes Orge / Oshimugi avec sept minutes Omugi Nanabutsuki Oshimugi
Entrez du texte → Entrée pour afficher les résultats de la recherche dans l'arborescence.
Les méthodes sont liées afin que vous puissiez effectuer une recherche avec la touche Entrée. La partie suivante:
ent_keyword.bind("<Return>", self.search)
L'arborescence de TTK est utilisée comme widget qui affiche les résultats de la recherche. Je l'aime car il peut être affiché simplement sous forme de tableau. Lorsque search
est exécuté, ʻupdate_tree_by_search_result` reçoit le résultat. Tous sont supprimés avant d'être insérés dans Treeview, puis ajoutés. Cette partie est le processus suivant:
def search(self, event=None):
keyword = self.keyword.get()
result = self.data[self.data[self.search_col].str.contains(keyword, na=False)]
self.update_tree_by_search_result(result)
def update_tree_by_search_result(self, result):
self.tree.delete(*self.tree.get_children())
self.result_text.set(f"Résultats de recherche:{len(result)}")
for _, row in result.iterrows():
self.tree.insert("", "end", values=row[self.colname_list].to_list())
Bien que cela ne soit pas mentionné dans le GIF, vous pouvez également utiliser ce résultat de recherche. Dans le code ci-dessous, ʻon Double` est lié comme processus lorsque l'élément d'arbre est double-cliqué.
self.tree.bind("<Double-1>", self.onDuble)
onDouble est le suivant. Vous pouvez maintenant obtenir la valeur de l'élément sélectionné.
def onDuble(self, event):
for item in self.tree.selection():
print(self.tree.item(item)["values"])
Recommended Posts