[Python / Tkinter] Rechercher Pandas DataFrame → Créer un formulaire de recherche simple à afficher

introduction

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.

échantillon

search.gif

Code complet

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

Un petit commentaire

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

[Python / Tkinter] Rechercher Pandas DataFrame → Créer un formulaire de recherche simple à afficher
Pandas Python: recherchez DataFrame à l'aide d'expressions régulières
[python] Créer une table de pandas DataFrame vers postgres
Conversion de Pandas DataFrame en System.Data.DataTable à l'aide de Python pour .NET
Un moyen simple d'éviter plusieurs boucles for en Python
[Python Kivy] Comment créer une simple fenêtre pop-up
Créer une interface graphique python à l'aide de tkinter
Créez un Dataframe pandas à partir d'une chaîne.
5 façons de créer un chatbot Python
[Python] Comment ajouter des lignes et des colonnes à une table (pandas DataFrame)
Python vba pour créer une chaîne de date pour créer un nom de fichier
Créer une application GUI simple en Python
Créons un environnement virtuel pour Python
[Python] Ajouter le nombre total de lignes à Pandas DataFrame
Créer un bloc de données à partir d'Excel à l'aide de pandas
[Python] Compréhension de liste Différentes façons de créer une liste
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Je veux créer un bel environnement de développement Python pour mon nouveau Mac
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
[Python] La route du serpent (6) Manipuler les pandas
Créer un LINE BOT avec Minette pour Python
Je veux créer une fenêtre avec Python
[Pandas Python] Créer un DataFrame vide à partir d'un DataFrame existant
Comment créer un fichier JSON en Python
Comment ajouter un chemin de recherche de module Python
Étapes pour créer un bot Twitter avec Python
Créer un modèle d'investissement dynamique simple en Python
Script pour créer facilement un environnement de périphérique client pour AWS IoT (version Python v2)
Créez une API simple juste pour entrer et sortir des fichiers JSON ~ Édition Python / Flask ~
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
Créer un ensemble de données d'images à utiliser pour la formation
Essayez de créer un Checkbutton dynamiquement avec Tkinter en Python
[Python] 2 Créez une carte risque-rendement pour votre portefeuille d'actifs
Résumé des méthodes de prétraitement pour les débutants en Python (trame de données Pandas)
Créez un plug-in pour exécuter Python Doctest avec Vim (1)
[Introduction à python] Introduction rapide à Python pour les programmeurs C ++ occupés
Comment afficher DataFrame sous forme de tableau dans Markdown
Comment créer un référentiel local pour le système d'exploitation Linux
[Python] Un mémo pour écrire du CSV verticalement avec Pandas
Créer une couche pour AWS Lambda Python dans Docker
Comment créer un simple script serveur / client TCP
Script Python qui crée un fichier JSON à partir d'un fichier CSV
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Créer un module Python
Créer un environnement Python
Application Python: Pandas # 3: Dataframe
Création d'une méthode pour sélectionner et visualiser automatiquement un graphique approprié pour les pandas DataFrame
J'ai fait un jeu de frappe simple avec tkinter de Python
[Python] Si vous souhaitez soudainement créer un formulaire de demande
[Python] Créez un écran de spécification de chemin de fichier et de dossier avec tkinter
Essayez d'afficher diverses informations utiles pour le débogage avec python
Application pour afficher et rechercher des mémos locaux (agenda) en Python
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
Créer un compte enfant de connect with Stripe en Python
[Python] Créer une liste de dates et d'heures pour une période spécifiée
Comment spécifier un serveur HTTP simple Python de répertoire public