如何修改PySimpleGUI示例代码实现主文件夹下子文件夹多选列表功能
实现方案
原来的get_file_list_dict函数核心逻辑是递归遍历所有目录层级筛选py文件,和你需要的「仅获取一级子文件夹」需求完全不匹配,直接重构逻辑更简单,具体步骤如下:
1. 新增主文件夹选择功能
在原界面中添加PySimpleGUI的文件夹选择组件,示例代码如下:
# 加入到你的布局代码里 layout = [ [sg.Text('选择主文件夹:'), sg.Input(key='-FOLDER_PATH-'), sg.FolderBrowse()], [sg.Button('加载子文件夹')], # 其他原有组件... ]
用户选择完成后,通过values['-FOLDER_PATH-']就能拿到选中的主文件夹路径。
2. 重写子文件夹获取逻辑
不需要修改原有get_file_list_dict,直接写新的函数仅遍历主文件夹第一层,获取所有子文件夹:
def get_first_level_subfolders(parent_path): """ 获取指定目录下的所有一级子文件夹 :param parent_path: 手动选择的主文件夹路径 :return: 字典,key为子文件夹名称,value为子文件夹完整路径 """ subfolder_map = {} # 仅遍历第一层目录,不递归 for item in os.scandir(parent_path): if item.is_dir(): # 兼容重名逻辑,和原代码逻辑对齐 if item.name not in subfolder_map: subfolder_map[item.name] = item.path else: for i in range(1, 100): new_name = f"{item.name}_{i}" if new_name not in subfolder_map: subfolder_map[new_name] = item.path break return subfolder_map
用户点击「加载子文件夹」按钮时,调用这个函数拿到子文件夹列表即可。
3. 调整列表组件支持多选
原有展示文件的列表组件修改为多选模式,示例如下:
# 加入到布局代码里,select_mode参数开启多选 [sg.Listbox(values=[], select_mode=sg.LISTBOX_SELECT_MODE_MULTIPLE, size=(50, 20), key='-SUBFOLDER_LIST-')]
调用完上面的子文件夹获取函数后,把字典的key列表传给Listbox的update方法刷新展示:
# 事件循环里的加载逻辑 if event == '加载子文件夹': subfolder_map = get_first_level_subfolders(values['-FOLDER_PATH-']) window['-SUBFOLDER_LIST-'].update(values=list(subfolder_map.keys())) # 把subfolder_map存成全局变量或者存在window的metadata里,后面取路径要用
4. 实现选中结果输出
在事件循环里添加确认按钮的逻辑,拿到选中的文件夹完整路径输出:
# 布局里加确认按钮 [sg.Button('输出选中文件夹'), sg.Button('退出')] # 事件循环里的输出逻辑 if event == '输出选中文件夹': selected_names = values['-SUBFOLDER_LIST-'] selected_paths = [subfolder_map[name] for name in selected_names] # 这里可以自定义输出逻辑,比如打印、弹窗展示、存文件都可以 print("选中的文件夹路径:", selected_paths) sg.popup("选中的文件夹:", "\n".join(selected_paths))
内容的提问来源于stack exchange,提问作者Joey Guerrero
相关产品推荐
相关产品推荐

