优化了 gui

This commit is contained in:
yml2213
2026-06-21 23:38:52 +08:00
parent af3951ec6f
commit 220fcd4052
4 changed files with 125 additions and 20 deletions
+81 -2
View File
@@ -9,11 +9,26 @@ from pathlib import Path
from queue import Queue, Empty
from typing import List
from loguru import logger
from douyu.config import Account, ProxyConfig
from utils import setup_logger
from .login_worker import LoginWorker, parse_accounts_text
from .widgets import AccountTable, LogPanel
LOG_LEVELS = ('DEBUG', 'INFO', 'WARNING', 'ERROR')
LOG_LEVEL_TAGS = {
'TRACE': 'debug',
'DEBUG': 'debug',
'INFO': 'info',
'SUCCESS': 'success',
'WARNING': 'warning',
'ERROR': 'error',
'CRITICAL': 'error',
}
class DouyuLoginApp:
"""斗鱼批量登录GUI应用"""
@@ -31,6 +46,8 @@ class DouyuLoginApp:
# 加载配置
self.proxy_config = self._load_proxy_config()
self.geetest_retries = self._load_geetest_retries()
self.log_level = self._load_log_level()
self._configure_logging(self.log_level)
# 创建主窗口
self.root = tk.Tk()
@@ -77,6 +94,45 @@ class DouyuLoginApp:
except:
return 5
def _load_log_level(self) -> str:
"""从配置文件加载默认日志等级。"""
try:
import yaml
with open(self.config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
level = config.get('log', {}).get('level', 'INFO').upper()
return level if level in LOG_LEVELS else 'INFO'
except:
return 'INFO'
def _configure_logging(self, level: str) -> None:
"""配置终端和GUI日志输出等级。"""
self.log_level = level if level in LOG_LEVELS else 'INFO'
setup_logger(level=self.log_level)
logger.add(
self._enqueue_log_record,
level=self.log_level,
format='{message}',
colorize=False,
)
def _enqueue_log_record(self, message) -> None:
"""把loguru日志转发到GUI日志队列。"""
record = message.record
level = record['level'].name
tag = LOG_LEVEL_TAGS.get(level, 'info')
text = (
f"{record['name']}:{record['function']}:{record['line']} | "
f"{record['message']}"
)
self.log_queue.put((tag, text))
def _on_log_level_change(self, _event=None) -> None:
"""切换日志等级。"""
level = self.log_level_var.get().upper()
self._configure_logging(level)
self.log_panel.append_log('info', f'日志等级已切换为: {level}')
def _create_ui(self):
"""创建用户界面"""
# 主容器
@@ -163,9 +219,13 @@ class DouyuLoginApp:
self.proxy_https_entry = ttk.Entry(static_frame, textvariable=self.proxy_https_var, width=20)
self.proxy_https_entry.pack(side='left', padx=(5, 0))
# 右侧配置:极验和日志
side_frame = ttk.Frame(config_frame)
side_frame.pack(side='right', fill='y', padx=(5, 0))
# 极验配置
geetest_frame = ttk.LabelFrame(config_frame, text='极验配置', padding=10)
geetest_frame.pack(side='right', fill='y', padx=(5, 0))
geetest_frame = ttk.LabelFrame(side_frame, text='极验配置', padding=10)
geetest_frame.pack(fill='x')
ttk.Label(geetest_frame, text='最大重试:').pack(anchor='w')
self.geetest_retries_var = tk.IntVar(value=self.geetest_retries)
@@ -173,6 +233,22 @@ class DouyuLoginApp:
textvariable=self.geetest_retries_var)
retries_spin.pack(anchor='w', pady=(5, 0))
# 日志配置
log_frame = ttk.LabelFrame(side_frame, text='日志配置', padding=10)
log_frame.pack(fill='x', pady=(8, 0))
ttk.Label(log_frame, text='等级:').pack(anchor='w')
self.log_level_var = tk.StringVar(value=self.log_level)
log_level_combo = ttk.Combobox(
log_frame,
values=LOG_LEVELS,
textvariable=self.log_level_var,
state='readonly',
width=10,
)
log_level_combo.pack(anchor='w', pady=(5, 0))
log_level_combo.bind('<<ComboboxSelected>>', self._on_log_level_change)
# 初始状态
self._on_proxy_toggle()
@@ -333,6 +409,8 @@ class DouyuLoginApp:
# 获取当前GUI配置
proxy_config = self._get_proxy_config()
geetest_retries = self.geetest_retries_var.get()
log_level = self.log_level_var.get().upper()
self._configure_logging(log_level)
# 验证代理配置
if proxy_config.enabled:
@@ -366,6 +444,7 @@ class DouyuLoginApp:
self.log_panel.append_log('info', '未使用代理')
self.log_panel.append_log('info', f'极验最大重试: {geetest_retries}')
self.log_panel.append_log('info', f'日志等级: {log_level}')
self.progress_var.set('登录中...')
# 启动登录线程