""" GUI结果显示模块 提供处理结果显示的图形界面。 """ import os import sys import tkinter as tk from tkinter import ttk, messagebox, scrolledtext import subprocess import platform def show_results_window(results): """显示批量处理结果窗口""" # 准备结果消息 if results['failed'] == 0: title = '处理完成' message = f"全部成功!\n共处理 {results['total']} 个文件,全部转换成功。" if results['main_output_folder']: message += f"\n主要输出文件夹: {results['main_output_folder']}" _show_simple_result(title, message, results['main_output_folder']) else: title = '处理完成' failed_text = "\n".join([f"- {item['name']}: {item['error']}" for item in results['failed_items']]) message = (f"处理完成!\n共处理 {results['total']} 个文件," f"{results['success']} 个成功,{results['failed']} 个失败。\n\n" f"失败项:\n{failed_text}") if results['main_output_folder']: message += f"\n主要输出文件夹: {results['main_output_folder']}" _show_detailed_result(title, message, results['main_output_folder']) def _show_simple_result(title, message, output_folder): """显示简单结果对话框""" # 创建结果窗口 result_window = tk.Toplevel() result_window.title(title) result_window.geometry('500x200') result_window.transient() result_window.grab_set() # 居中窗口 result_window.geometry('+{}+{}'.format( result_window.winfo_screenwidth() // 2 - 250, result_window.winfo_screenheight() // 2 - 100 )) # 消息区域 message_frame = ttk.Frame(result_window) message_frame.pack(fill='both', expand=True, padx=20, pady=20) # 消息文本 message_label = ttk.Label(message_frame, text=message, justify='left', wraplength=450) message_label.pack(expand=True) # 按钮区域 button_frame = ttk.Frame(result_window) button_frame.pack(fill='x', padx=20, pady=(0, 20)) def open_folder_and_close(): if output_folder and os.path.exists(output_folder): _open_folder(output_folder) result_window.destroy() def close_window(): result_window.destroy() # 按钮 if output_folder and os.path.exists(output_folder): ttk.Button(button_frame, text='打开输出文件夹', command=open_folder_and_close).pack(side='left', padx=(0, 10)) ttk.Button(button_frame, text='关闭', command=close_window).pack(side='right') # 等待窗口关闭 result_window.wait_window() def _show_detailed_result(title, message, output_folder): """显示详细结果对话框""" # 创建结果窗口 result_window = tk.Toplevel() result_window.title(title) result_window.geometry('700x500') result_window.transient() result_window.grab_set() # 居中窗口 result_window.geometry('+{}+{}'.format( result_window.winfo_screenwidth() // 2 - 350, result_window.winfo_screenheight() // 2 - 250 )) # 消息区域 message_frame = ttk.Frame(result_window) message_frame.pack(fill='both', expand=True, padx=20, pady=20) # 滚动文本区域 text_widget = scrolledtext.ScrolledText(message_frame, wrap=tk.WORD, state='normal') text_widget.pack(fill='both', expand=True) text_widget.insert('1.0', message) text_widget.configure(state='disabled') # 按钮区域 button_frame = ttk.Frame(result_window) button_frame.pack(fill='x', padx=20, pady=(0, 20)) def open_folder_and_close(): if output_folder and os.path.exists(output_folder): _open_folder(output_folder) result_window.destroy() def close_window(): result_window.destroy() # 按钮 if output_folder and os.path.exists(output_folder): ttk.Button(button_frame, text='打开输出文件夹', command=open_folder_and_close).pack(side='left', padx=(0, 10)) ttk.Button(button_frame, text='关闭', command=close_window).pack(side='right') # 等待窗口关闭 result_window.wait_window() def _open_folder(folder_path): """打开文件夹""" try: system = platform.system() if system == 'Windows': os.startfile(folder_path) elif system == 'Darwin': # macOS subprocess.run(['open', folder_path]) else: # Linux subprocess.run(['xdg-open', folder_path]) except Exception as e: messagebox.showerror('错误', f'无法打开文件夹: {e}')