138 lines
4.6 KiB
Python
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}') |