如何为ttk.Treeview添加搜索功能,匹配输入框内容并展示对应行
Tkinter Treeview 多输入框匹配筛选实现方案
核心实现逻辑
你已经通过pandas加载了CSV数据源,直接基于DataFrame做筛选的效率远高于遍历Treeview控件取值,更适合数据量较大的场景。如果需要直接从Treeview中提取所有值,也可以用下方的工具方法。
方法1:从Treeview中提取所有行数据
def get_all_treeview_values(tree): all_rows = [] # 遍历Treeview所有子节点(即每一行) for item_id in tree.get_children(): # 获取当前行的所有值 row_data = tree.item(item_id, "values") all_rows.append(list(row_data)) return all_rows
方法2:基于原始DataFrame实现多输入框模糊筛选(推荐)
完整可运行实现代码如下,支持多关键词任意字段匹配,可自定义匹配规则:
import tkinter as tk from tkinter import ttk import pandas as pd root = tk.Tk() root.geometry("900x600") # 全局存储原始数据源 books_data = pd.read_csv("List of Books - Sheet1 (3).csv") # 存储所有输入框对象,根据你的实际输入框数量调整 input_entries = [] # 示例创建3个输入框,可对应不同字段的搜索 for idx in range(3): entry = tk.Entry(root, width=20) entry.grid(row=0, column=idx, padx=8, pady=10) input_entries.append(entry) # 初始化Treeview tree = ttk.Treeview(root) tree["columns"] = list(books_data.columns) tree["show"] = "headings" for col in tree["columns"]: tree.heading(col, text=col) tree.column(col, width=120) # Treeview刷新方法 def refresh_tree(data=None): # 清空现有内容 for item in tree.get_children(): tree.delete(item) # 无筛选数据时展示全部,否则展示筛选结果 show_data = data if data is not None else books_data for row in show_data.to_numpy().tolist(): tree.insert("", "end", values=row) # 初始加载全量数据 refresh_tree() tree.grid(row=4, column=0, columnspan=8, padx=5, pady=10) # 核心筛选逻辑 def match_rows(): # 收集所有非空搜索关键词,转小写实现不区分大小写匹配 search_keys = [e.get().strip().lower() for e in input_entries if e.get().strip()] # 无关键词时展示全部数据 if not search_keys: refresh_tree() return # 匹配规则:任意单元格包含任意一个关键词即命中 match_mask = books_data.apply( lambda row: any(key in str(cell).lower() for cell in row for key in search_keys), axis=1 ) filtered = books_data[match_mask] refresh_tree(filtered) # 绑定触发方式:可选择按钮点击或者输入框回车触发 # 1. 筛选按钮触发 search_btn = tk.Button(root, text="搜索匹配", command=match_rows, bg="#e0e0e0") search_btn.grid(row=0, column=3, padx=8, pady=10) # 2. 输入框回车触发 for entry in input_entries: entry.bind("<Return>", lambda e: match_rows()) root.mainloop()
自定义调整说明
- 如果需要精确匹配,把匹配逻辑里的
key in str(cell).lower()改成key == str(cell).lower()即可 - 如果需要指定字段匹配,修改apply里的遍历逻辑,只判断对应列的值即可
内容的提问来源于stack exchange,提问作者Noahwaaa
相关产品推荐
相关产品推荐

