85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
"""
|
|
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 |