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

Python Tkinter实现SKU输入动态建议下拉菜单(从目录获取文件夹名称作为建议)的技术咨询

Python Tkinter实现SKU输入动态建议下拉菜单(从目录获取文件夹名称作为建议)的技术咨询

嗨,我完全懂你的需求——你想给这个SKU小工具加上动态下拉建议,而且建议得从指定目录里的文件夹名自动获取,每次启动程序都能更新,这样输入SKU的时候能更省心。作为经常用Tkinter做实用小工具的开发者,我来帮你修改代码实现这个功能,同时保留你原来所有的核心操作逻辑。

核心实现思路

我们用Tkinter自带的ttk.Combobox替换原来的普通输入框,它既能保留自由输入的功能,又能展示下拉建议列表。同时写一个目录遍历函数,在程序启动时自动收集目标路径下的所有SKU文件夹名,还能加个实时输入过滤的功能——输入部分字符,下拉列表就自动显示匹配的SKU,进一步提升效率。

修改后的完整代码

import os
import tkinter as tk
from tkinter import ttk, filedialog

def load_sku_list():
    """加载指定目录下所有SKU文件夹名称,返回去重排序后的列表"""
    base_path = r'Z:\Product Data\Family Folders'
    sku_list = []
    # 遍历所有子目录,收集符合格式的SKU文件夹名
    for root, dirs, files in os.walk(base_path):
        for dir_name in dirs:
            # 只收集以MX-开头的文件夹(匹配你的SKU规则)
            if dir_name.startswith("MX-"):
                sku_list.append(dir_name)
    # 去重+排序,让列表更整洁
    return sorted(list(set(sku_list)))

def filter_sku_list(event):
    """实时过滤下拉建议,根据输入内容匹配SKU"""
    input_text = sku_entry.get().strip()
    # 输入为空时显示所有SKU,否则显示包含输入内容的SKU(不区分大小写)
    if not input_text:
        sku_entry['values'] = sku_list
    else:
        filtered_items = [sku for sku in sku_list if input_text.lower() in sku.lower()]
        sku_entry['values'] = sorted(filtered_items)

def open_pdf_in_folder(product_folder):
    pdf_folder_path = os.path.join(product_folder, "Production", "2-Documentation_PDFs")
    if os.path.exists(pdf_folder_path):
        for filename in os.listdir(pdf_folder_path):
            if filename.lower().endswith('.pdf'):
                pdf_path = os.path.join(pdf_folder_path, filename)
                try:
                    os.startfile(pdf_path)
                    result_label.config(text=f"Opened PDF at: {pdf_path}")
                except Exception as e:
                    result_label.config(text=f"Error opening PDF: {e}")
                return
        result_label.config(text="No PDF file found in the '2-Documentation_PDFs' folder.")
    else:
        result_label.config(text="Documentation folder not found.")

def open_folder_by_sku(product_folder):
    try:
        os.startfile(product_folder, '')
        result_label.config(text=f"Opened folder at: {product_folder}")
    except Exception as e:
        result_label.config(text=f"Error opening folder: {e}")

def open_explorer_with_sku():
    sku = sku_entry.get().strip()
    if not sku.startswith("MX-"):
        sku = "MX-" + sku
    base_path = r'Z:\Product Data\Family Folders'
    for root, dirs, files in os.walk(base_path):
        if sku in dirs:
            product_folder = os.path.join(root, sku)
            open_pdf_in_folder(product_folder)
            return
    result_label.config(text=f"Folder for SKU {sku} not found.")

def open_explorer_with_sku2():
    sku = sku_entry.get().strip()
    if not sku.startswith("MX-"):
        sku = "MX-" + sku
    base_path = r'Z:\Product Data\Family Folders'
    for root, dirs, files in os.walk(base_path):
        if sku in dirs:
            product_folder = os.path.join(root, sku)
            os.system(f'explorer "{product_folder}"')
            result_label.config(text=f"Opened folder at: {product_folder}")
            return
    result_label.config(text=f"Folder for SKU {sku} not found.")

def browse_folder():
    folder_path = filedialog.askdirectory()
    if folder_path:
        sku_entry.delete(0, tk.END)
        sku_entry.insert(0, os.path.basename(folder_path))

def clear_sku_entry():
    sku_entry.delete(0, tk.END)
    result_label.config(text="")

def refresh_sku_list():
    """手动刷新SKU列表,适配目录内容更新"""
    global sku_list
    sku_list = load_sku_list()
    sku_entry['values'] = sku_list
    result_label.config(text="SKU列表已刷新")

# 初始化程序窗口
app = tk.Tk()
app.title("SKU Explorer")

# 加载初始SKU列表
sku_list = load_sku_list()

# 创建界面组件
sku_label = ttk.Label(app, text="Enter SKU:")
# 用Combobox替代普通Entry,实现下拉建议功能
sku_entry = ttk.Combobox(app, values=sku_list, width=30)
sku_entry.bind('<KeyRelease>', filter_sku_list)  # 绑定输入事件实现实时过滤

pdf_button = ttk.Button(app, text="Open PDF", command=open_explorer_with_sku)
folder_button = ttk.Button(app, text="Open Folder", command=open_explorer_with_sku2)
refresh_button = ttk.Button(app, text="Refresh SKUs", command=refresh_sku_list)
clear_button = ttk.Button(app, text="Clear", command=clear_sku_entry)
result_label = ttk.Label(app, text="", wraplength=400)  # 自动换行避免内容溢出

# 界面布局调整
sku_label.grid(row=0, column=0, padx=10, pady=10, sticky="E")
sku_entry.grid(row=0, column=1, padx=10, pady=10, sticky="EW")
refresh_button.grid(row=0, column=2, padx=10, pady=10)
clear_button.grid(row=0, column=3, padx=10, pady=10)

pdf_button.grid(row=1, column=1, padx=10, pady=10)
folder_button.grid(row=1, column=2, padx=10, pady=10)

result_label.grid(row=2, column=0, columnspan=4, padx=10, pady=10)

# 让输入框自适应窗口宽度
app.grid_columnconfigure(1, weight=1)

app.mainloop()

关键功能说明

  • 动态加载SKU列表:程序启动时自动遍历目标目录,收集所有符合MX-前缀规则的文件夹名,作为下拉建议的数据源,还会自动去重排序,确保列表整洁。
  • 实时输入过滤:绑定了<KeyRelease>事件,每次输入或删除字符时,都会自动过滤列表,只显示包含输入内容的SKU(不区分大小写),输入效率大幅提升。
  • 保留原有核心功能:自动补全MX-前缀、打开对应PDF、打开目标文件夹、浏览文件夹填充SKU、清空输入这些功能都完整保留。
  • 手动刷新按钮:如果目录里的SKU文件夹有新增或删除,点击Refresh SKUs按钮就能重新加载列表,不用重启程序。

打包成EXE的小提示

如果要把脚本打包成.exe桌面应用,可以用pyinstaller工具,执行以下命令即可:

pyinstaller --onefile --windowed --name SKUExplorer your_script_name.py

--windowed参数会去掉命令行窗口,让工具更像标准桌面应用。

备注:内容来源于stack exchange,提问作者Peter Languilla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:10:26