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
相关产品推荐
相关产品推荐

