TxT2Docx/gui_results.py
2025-09-21 20:40:36 +08:00

138 lines
4.6 KiB
Python

"""
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}')