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

Python新手求助:如何为本地图片查看器添加图片名称搜索栏功能

解决方法:给PySimpleGUI图片查看器添加搜索过滤功能

完全理解你的痛点——2万条图片靠滚动列表找根本不现实!咱们直接把原来的列表改成带实时搜索过滤的版本,既保留列表的灵活性,又能快速定位到你要的图片。

修改后的完整代码

import PySimpleGUI as sg
import os.path

# 调整布局:添加搜索栏
file_list_column = [
    [
        sg.Text("Image Folder"),
        sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),
        sg.FolderBrowse(),
    ],
    # 新增搜索输入栏
    [
        sg.Text("Search by Name:"),
        sg.In(size=(35, 1), enable_events=True, key="-SEARCH-", placeholder="输入图片名关键词..."),
    ],
    [
        sg.Listbox(
            values=[], enable_events=True, size=(40, 20), key="-FILE LIST-"
        )
    ],
]

image_viewer_column = [
    [sg.Text("匹配的图片会在这里显示:")],
    [sg.Text(size=(40, 1), key="-TOUT-")],
    [sg.Image(key="-IMAGE-")],
]

# 完整布局
layout = [
    [
        sg.Column(file_list_column),
        sg.VSeperator(),
        sg.Column(image_viewer_column),
    ]
]

window = sg.Window("通讯录式图片查看器", layout)
# 新增变量保存所有符合条件的图片(避免重复遍历文件夹)
full_file_list = []

# 事件循环
while True:
    event, values = window.read()
    if event == "Exit" or event == sg.WIN_CLOSED:
        break

    # 选择文件夹后,加载所有图片文件
    if event == "-FOLDER-":
        folder = values["-FOLDER-"]
        try:
            file_list = os.listdir(folder)
        except:
            file_list = []
        # 扩展支持更多图片格式(png/gif/jpg/jpeg)
        full_file_list = [
            f for f in file_list
            if os.path.isfile(os.path.join(folder, f))
            and f.lower().endswith((".png", ".gif", ".jpg", ".jpeg"))
        ]
        window["-FILE LIST-"].update(full_file_list)
        # 清空显示区域
        window["-TOUT-"].update("请输入关键词搜索图片")
        window["-IMAGE-"].update()

    # 搜索栏输入时,实时过滤列表
    elif event == "-SEARCH-":
        search_term = values["-SEARCH-"].lower()
        # 过滤包含关键词的文件名(忽略大小写)
        filtered_files = [f for f in full_file_list if search_term in f.lower()]
        window["-FILE LIST-"].update(filtered_files)

        # 自动显示第一个匹配的图片(可选,提升体验)
        if filtered_files:
            target_file = os.path.join(values["-FOLDER-"], filtered_files[0])
            window["-TOUT-"].update(target_file)
            window["-IMAGE-"].update(filename=target_file)
        else:
            window["-TOUT-"].update("未找到匹配的图片")
            window["-IMAGE-"].update()

    # 点击列表项时,显示对应图片(保留原功能)
    elif event == "-FILE LIST-":
        try:
            selected_file = os.path.join(values["-FOLDER-"], values["-FILE LIST-"][0])
            window["-TOUT-"].update(selected_file)
            window["-IMAGE-"].update(filename=selected_file)
        except:
            pass

window.close()

关键修改点说明

  1. 添加搜索栏:在文件列表区域新增了一个带placeholder的输入框,绑定-SEARCH-事件,输入时实时触发过滤。
  2. 缓存完整文件列表:用full_file_list变量保存所有符合条件的图片,避免每次搜索都重新遍历文件夹,提升2万条文件时的性能。
  3. 实时过滤逻辑:搜索时将关键词和文件名都转成小写,实现不区分大小写的模糊匹配——输入Henry或henry都能找到Henry.jpg。
  4. 自动显示匹配结果:搜索到结果后自动显示第一个匹配的图片,不用手动点击列表,更贴合你要的"通讯录"体验。
  5. 扩展图片格式支持:原来只支持png/gif,现在加上了jpg/jpeg,覆盖更常见的图片类型。

新手友好提示

  • 先确保安装了PySimpleGUI:打开终端输入 pip install pysimplegui
  • 如果你的图片文件名和人名完全对应(比如Henry.png),可以把过滤逻辑改成精确匹配:f.lower() == search_term.lower(),这样搜索更准确。
  • 如果图片太大显示不全,可以给sg.Image加size=(width, height)参数,比如sg.Image(key="-IMAGE-", size=(400, 300))。

内容的提问来源于stack exchange,提问作者okapirider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:47:37