fix:添加niceGui库美化页面
This commit is contained in:
15
ui/core/logger.py
Normal file
15
ui/core/logger.py
Normal file
@@ -0,0 +1,15 @@
|
||||
import sys
|
||||
from loguru import logger
|
||||
from ui.core.state import app_state
|
||||
|
||||
class GuiLogger:
|
||||
def write(self, message):
|
||||
if app_state.log_element:
|
||||
app_state.log_element.push(message.strip())
|
||||
|
||||
def setup_logger():
|
||||
logger.remove()
|
||||
# 控制台输出
|
||||
logger.add(sys.stderr, format="{time:HH:mm:ss} | {level} | {message}")
|
||||
# GUI 输出
|
||||
logger.add(GuiLogger(), format="{time:HH:mm:ss} | {level} | {message}", level="INFO")
|
||||
13
ui/core/state.py
Normal file
13
ui/core/state.py
Normal file
@@ -0,0 +1,13 @@
|
||||
import threading
|
||||
|
||||
class AppState:
|
||||
def __init__(self):
|
||||
self.stop_event = threading.Event()
|
||||
self.is_running = False
|
||||
# 这些 UI 元素的引用将在 UI 初始化时被赋值
|
||||
self.progress_bar = None
|
||||
self.progress_label = None
|
||||
self.log_element = None
|
||||
|
||||
# 创建全局单例
|
||||
app_state = AppState()
|
||||
73
ui/core/task_runner.py
Normal file
73
ui/core/task_runner.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import tkinter as tk
|
||||
from tkinter import filedialog
|
||||
from nicegui import ui, run
|
||||
from loguru import logger
|
||||
|
||||
from ui.core.state import app_state
|
||||
|
||||
|
||||
async def select_folder():
|
||||
"""在 Native 模式下弹窗选择文件夹"""
|
||||
|
||||
def _pick():
|
||||
root = tk.Tk()
|
||||
root.withdraw()
|
||||
root.attributes("-topmost", True)
|
||||
path = filedialog.askdirectory()
|
||||
root.destroy()
|
||||
return path
|
||||
|
||||
return await run.io_bound(_pick)
|
||||
|
||||
|
||||
async def run_task(func, *args, **kwargs):
|
||||
"""通用任务执行器"""
|
||||
if app_state.is_running:
|
||||
ui.notify("当前有任务正在运行,请稍候...", type="warning")
|
||||
return
|
||||
|
||||
# 1. 状态重置
|
||||
app_state.is_running = True
|
||||
app_state.stop_event.clear()
|
||||
if app_state.progress_bar: app_state.progress_bar.set_value(0)
|
||||
if app_state.progress_label: app_state.progress_label.set_text("🚀 正在启动任务...")
|
||||
|
||||
# 2. 定义进度条回调
|
||||
def progress_callback(current, total, task_name="任务"):
|
||||
if total <= 0:
|
||||
pct = 0
|
||||
text = f"{task_name}: 准备中..."
|
||||
else:
|
||||
pct = current / total
|
||||
text = f"{task_name}: {current}/{total} ({int(pct * 100)}%)"
|
||||
|
||||
# 更新 UI
|
||||
if app_state.progress_bar: app_state.progress_bar.set_value(pct)
|
||||
if app_state.progress_label: app_state.progress_label.set_text(text)
|
||||
|
||||
# 3. 组装参数
|
||||
kwargs['progress_callback'] = progress_callback
|
||||
kwargs['stop_event'] = app_state.stop_event
|
||||
|
||||
# 4. 执行
|
||||
try:
|
||||
# 适配器:检查函数是否接受 stop_event
|
||||
def _exec():
|
||||
try:
|
||||
func(*args, **kwargs)
|
||||
except TypeError:
|
||||
kwargs.pop('stop_event', None)
|
||||
func(*args, **kwargs)
|
||||
|
||||
await run.io_bound(_exec)
|
||||
|
||||
if app_state.progress_label: app_state.progress_label.set_text("✅ 任务完成")
|
||||
ui.notify("任务执行成功!", type="positive")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"任务出错: {e}")
|
||||
if app_state.progress_label: app_state.progress_label.set_text(f"❌ 错误: {str(e)}")
|
||||
ui.notify(f"任务失败: {e}", type="negative")
|
||||
finally:
|
||||
app_state.is_running = False
|
||||
if app_state.progress_bar: app_state.progress_bar.set_value(0)
|
||||
Reference in New Issue
Block a user