修改:;PEP 8: E302 expected 2 blank lines, found 1 代码# ui_config.py
# 用户界面配置管理模块
import json
import logging
import sys
from pathlib import Path
from typing import Dict, Any, Optional, List
# 设置日志
logger = logging.getLogger(__name__)
UI_CONFIG = {
"theme": "dark",
"language": "zh-CN",
"font_size": 14
}
class UIConfig:
"""用户界面配置管理类"""
# 主题配置
THEMES = {
"dark": {
"name": "深色主题",
"background": "#2b2b2b",
"foreground": "#ffffff",
"accent": "#007acc",
"secondary": "#3c3c3c",
"text": "#e0e0e0",
"success": "#4caf50",
"warning": "#ff9800",
"error": "#f44336"
},
"light": {
"name": "浅色主题",
"background": "#f5f5f5",
"foreground": "#2b2b2b",
"accent": "#2196f3",
"secondary": "#e0e0e0",
"text": "#212121",
"success": "#4caf50",
"warning": "#ff9800",
"error": "#f44336"
},
"blue": {
"name": "蓝色主题",
"background": "#1e3a5f",
"foreground": "#ffffff",
"accent": "#4fc3f7",
"secondary": "#2c4d75",
"text": "#e3f2fd",
"success": "#81c784",
"warning": "#ffb74d",
"error": "#e57373"
}
}
# 语言配置
LANGUAGES = {
"zh-CN": "简体中文",
"zh-TW": "繁體中文",
"en-US": "English"
}
# 模块ID常量(直接从global_config.py复制过来)
MODULE1_ID = "input_analysis"
MODULE2_ID = "combination_analysis"
MODULE3_ID = "follow_analysis_engine"
MODULE4_ID = "trend_analysis"
MODULE5_ID = "number_generation"
# 默认UI配置
DEFAULT_CONFIG = {
"theme": "dark",
"language": "zh-CN",
"font_size": 12,
"font_family": "Microsoft YaHei",
"window_width": 1200,
"window_height": 800,
"show_status_bar": True,
"show_tool_bar": True,
"recent_files": [],
"auto_save_interval": 5, # 分钟
"confirm_exit": True,
"max_recent_files": 10,
"module_order": [
MODULE1_ID,
MODULE2_ID,
MODULE3_ID,
MODULE4_ID,
MODULE5_ID
],
"module_visibility": {
MODULE1_ID: True,
MODULE2_ID: True,
MODULE3_ID: True,
MODULE4_ID: True,
MODULE5_ID: True
}
}
_instance = None
def __init__(self):
self._initialized = False
self._config = None
self._config_path = None
@classmethod
def get_instance(cls):
"""获取单例实例"""
if cls._instance is None:
cls._instance = UIConfig()
return cls._instance
def initialize(self, config_path: Optional[str] = None):
"""初始化UI配置"""
if self._initialized:
return True
if config_path is None:
# 使用项目根目录
base_dir = Path(__file__).parent.parent
self._config_path = base_dir / "config" / "ui_config.json"
else:
self._config_path = Path(config_path)
# 确保配置目录存在
self._config_path.parent.mkdir(parents=True, exist_ok=True)
# 加载配置
self._load_config()
self._initialized = True
logger.info(f"✅ UI配置已初始化: {self._config_path}")
return True
def _load_config(self):
"""加载配置文件"""
try:
if self._config_path.exists():
with open(self._config_path, 'r', encoding='utf-8') as f:
self._config = json.load(f)
logger.info(f"✅ 已加载UI配置: {self._config_path}")
else:
self._config = self.DEFAULT_CONFIG.copy()
self._save_config()
logger.info(f"✅ 已创建默认UI配置: {self._config_path}")
except Exception as e:
logger.error(f"❌ 加载UI配置失败: {e}")
self._config = self.DEFAULT_CONFIG.copy()
def _save_config(self):
"""保存配置到文件"""
try:
with open(self._config_path, 'w', encoding='utf-8') as f:
json.dump(self._config, f, indent=2, ensure_ascii=False)
return True
except Exception as e:
logger.error(f"❌ 保存UI配置失败: {e}")
return False
def get(self, key: str, default=None):
"""获取配置值"""
if not self._initialized:
self.initialize()
return self._config.get(key, default)
def set(self, key: str, value: Any, save: bool = True):
"""设置配置值"""
if not self._initialized:
self.initialize()
self._config[key] = value
if save:
return self._save_config()
return True
def update(self, updates: Dict[str, Any], save: bool = True):
"""批量更新配置"""
if not self._initialized:
self.initialize()
self._config.update(updates)
if save:
return self._save_config()
return True
def add_recent_file(self, file_path: str):
"""添加最近使用的文件"""
if not self._initialized:
self.initialize()
recent_files = self.get("recent_files", [])
# 移除已存在的相同路径
if file_path in recent_files:
recent_files.remove(file_path)
# 添加到开头
recent_files.insert(0, file_path)
# 限制最大数量
max_files = self.get("max_recent_files", 10)
if len(recent_files) > max_files:
recent_files = recent_files[:max_files]
return self.set("recent_files", recent_files)
def get_theme_config(self, theme_name: Optional[str] = None) -> Dict[str, str]:
"""获取主题配置"""
if theme_name is None:
theme_name = self.get("theme", "dark")
return self.THEMES.get(theme_name, self.THEMES["dark"])
def get_current_theme(self) -> Dict[str, str]:
"""获取当前主题配置"""
return self.get_theme_config()
def get_module_visibility(self, module_id: str) -> bool:
"""获取模块可见性"""
visibility = self.get("module_visibility", {})
return visibility.get(module_id, True)
def set_module_visibility(self, module_id: str, visible: bool) -> bool:
"""设置模块可见性"""
visibility = self.get("module_visibility", {})
visibility[module_id] = visible
return self.set("module_visibility", visibility)
def get_module_order(self) -> List[str]:
"""获取模块顺序"""
return self.get("module_order", [])
def set_module_order(self, order: List[str]) -> bool:
"""设置模块顺序"""
return self.set("module_order", order)
@staticmethod
def get_base_dir() -> Path:
"""获取项目根目录"""
return Path(__file__).parent.parent
# 全局UI配置实例
ui_config = UIConfig.get_instance()
# 便捷函数
def get_ui_config() -> UIConfig:
"""获取UI配置实例"""
return UIConfig.get_instance()
def init_ui_config(config_path: Optional[str] = None) -> bool:
"""初始化UI配置"""
return UIConfig.get_instance().initialize(config_path)
def get_theme_config(theme_name: Optional[str] = None) -> Dict[str, str]:
"""获取主题配置"""
return UIConfig.get_instance().get_theme_config(theme_name)
if __name__ == "__main__":
# 测试代码
init_ui_config()
config = get_ui_config()
print("当前主题:", config.get("theme"))
print("字体大小:", config.get("font_size"))
print("深色主题配置:", config.get_theme_config("dark"))