TxT2Docx/gui_matching_editor.py

85 lines
2.9 KiB
Python
Raw Normal View History

2025-09-21 19:01:40 +08:00
"""
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