You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:15:03