""" GUI匹配编辑器模块 提供编辑文件匹配关系的图形界面。 """ import os import PySimpleGUI as sg def show_matching_editor(matched_pairs, images_root): """显示匹配编辑窗口,允许手动调整匹配关系""" # 获取所有图片文件夹 all_image_folders = [] if os.path.isdir(images_root): for root, dirs, _ in os.walk(images_root): for dir_name in dirs: folder_path = os.path.join(root, dir_name) rel_path = os.path.relpath(folder_path, images_root) all_image_folders.append((folder_path, rel_path)) # 准备表格数据 table_data = [] for i, pair in enumerate(matched_pairs): txt_name = pair['txt']['name'] img_folder = pair['image_folder']['relative_path'] if pair['image_folder'] else "无匹配" table_data.append([i, txt_name, img_folder]) layout = [ [sg.Text('文件匹配编辑', font=('bold', 14))], [sg.Text('选择要修改的项目,然后从右侧选择图片文件夹')], [ sg.Table( values=table_data, headings=['序号', 'TXT文件名', '匹配的图片文件夹'], key='-TABLE-', select_mode=sg.TABLE_SELECT_MODE_BROWSE, enable_events=True, justification='left', size=(None, 15) ), sg.VSeparator(), sg.Listbox( values=[f[1] for f in all_image_folders], key='-FOLDERS-', size=(40, 15), enable_events=True ) ], [sg.Button('设置选中项'), sg.Button('清除选中项'), sg.Button('应用所有')] ] window = sg.Window('匹配编辑', layout, resizable=True) selected_row = None while True: event, values = window.read() if event in (sg.WIN_CLOSED, '应用所有'): break if event == '-TABLE-': if values['-TABLE-']: selected_row = values['-TABLE-'][0] if event == '设置选中项' and selected_row is not None and values['-FOLDERS-']: folder_idx = [i for i, f in enumerate(all_image_folders) if f[1] == values['-FOLDERS-'][0]][0] folder_path, folder_rel = all_image_folders[folder_idx] matched_pairs[selected_row]['image_folder'] = { "path": folder_path, "name": os.path.basename(folder_path), "relative_path": folder_rel } table_data[selected_row][2] = folder_rel window['-TABLE-'].update(values=table_data) if event == '清除选中项' and selected_row is not None: matched_pairs[selected_row]['image_folder'] = None table_data[selected_row][2] = "无匹配" window['-TABLE-'].update(values=table_data) window.close() return matched_pairs