Bei der Verwendung von DataFrame gibt es Situationen, in denen ich wünschte, ich könnte es suchen und anzeigen. Dies ist besonders nützlich beim Erstellen von GUI-Apps. Ich möchte unten nach Pandas DataFrame suchen und ein Suchformular erstellen, das mit Tkinter angezeigt werden soll.
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("Suchfenster")
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 = ["Lebensmittelcode", "Name des Lebensmittels"] #Spaltenname, der in den Suchergebnissen angezeigt werden soll
self.width_list = [100, 200]
self.search_col = "Suchbegriff" # Suchbegriffの入力されている列名
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="Stichwort", 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"Suchergebnisse:{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()
Der Inhalt der gelesenen CSV lautet wie folgt. ::
Lebensmittelcode Lebensmittelname Suchwort
0 1001 Amaranthus / Echtes Amaranthus / Echtes Amaransasu
1 1002 Awa / Weißkorn Awa / Weißkorn Awa
2 1003 Awa / Awamochi Awa / Awamochi Awamochi
3 1004 Enbaku / Otomeal Enbaku / Otomeal Enbaku Otomiru Oto Otsu
4 1005 Gerste / Oshimugi mit sieben Minuten Gerste / Oshimugi mit sieben Minuten Omugi Nanabutsuki Oshimugi
Text eingeben → Eingabe, um die Suchergebnisse im Baum anzuzeigen.
Die Methoden sind verknüpft, sodass Sie mit der Eingabetaste suchen können. Der folgende Teil:
ent_keyword.bind("<Return>", self.search)
Die Baumansicht von TTK wird als Widget verwendet, das die Suchergebnisse anzeigt. Ich mag es, weil es einfach in Tabellenform angezeigt werden kann. Wenn search
ausgeführt wird, erhält update_tree_by_search_result
das Ergebnis. Alle werden vor dem Einfügen in Treeview gelöscht und dann hinzugefügt. Dieser Teil ist der folgende Prozess:
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"Suchergebnisse:{len(result)}")
for _, row in result.iterrows():
self.tree.insert("", "end", values=row[self.colname_list].to_list())
Obwohl im GIF nicht erwähnt, können Sie dieses Suchergebnis auch verwenden. Der folgende Code verknüpft "onDouble" als den Vorgang, wenn auf ein Baumelement doppelklickt wird.
self.tree.bind("<Double-1>", self.onDuble)
onDouble ist wie folgt. Sie können jetzt den Wert des ausgewählten Elements abrufen.
def onDuble(self, event):
for item in self.tree.selection():
print(self.tree.item(item)["values"])
Recommended Posts