diff --git a/MetaCore/data/project_manager.py b/MetaCore/data/project_manager.py index 1485de9..3cf190e 100644 --- a/MetaCore/data/project_manager.py +++ b/MetaCore/data/project_manager.py @@ -120,6 +120,39 @@ class PlatformUtils: else: return venv_path / 'bin' / 'python' + @staticmethod + def find_venv_path(project_path: Path) -> Optional[Path]: + """ + 查找项目中的虚拟环境路径 + 根据平台规定虚拟环境目录名称: + - Windows: .venv + - Ubuntu/Linux: venv + - macOS: venv + """ + system = PlatformUtils.get_system_type() + + # 根据平台确定虚拟环境目录名 + if system == 'windows': + venv_name = '.venv' + else: # Linux, macOS等 + venv_name = 'venv' + + venv_path = project_path / venv_name + + # 检查虚拟环境是否存在 + if venv_path.exists() and venv_path.is_dir(): + # 验证是否是有效的虚拟环境目录 + python_exec = PlatformUtils.get_python_executable(venv_path) + if python_exec.exists(): + print(f"找到虚拟环境: {venv_path}") + return venv_path + else: + print(f"虚拟环境目录存在但无效(缺少Python解释器): {venv_path}") + return None + else: + print(f"虚拟环境不存在: {venv_path} (平台: {system})") + return None + @staticmethod def get_pycharm_paths() -> List[Path]: """获取各平台PyCharm可能的安装路径""" @@ -874,19 +907,28 @@ if __name__ == "__main__": # 构建命令 cmd = [str(python_executable), str(script_path_obj)] if args: - print("参数:", args) - cmd.extend(args) + # 将所有参数转换为字符串,处理 Path 对象 + str_args = [str(arg) for arg in args] + print("参数:", str_args) + cmd.extend(str_args) # 设置环境变量 env = os.environ.copy() env['VIRTUAL_ENV'] = str(venv_path_obj) + # 强制子进程使用 UTF-8 编码,避免 emoji 和特殊字符编码错误 + env['PYTHONIOENCODING'] = 'utf-8' + system = PlatformUtils.get_system_type() if system == 'windows': env['PATH'] = str(venv_path_obj / 'Scripts') + os.pathsep + env['PATH'] else: env['PATH'] = str(venv_path_obj / 'bin') + os.pathsep + env['PATH'] + # 根据平台确定编码 + # 注意:子进程会使用 UTF-8(通过 PYTHONIOENCODING),这里用于读取子进程输出 + encoding = 'utf-8' # 统一使用 UTF-8 + # 执行命令 process = subprocess.Popen( cmd, @@ -894,7 +936,8 @@ if __name__ == "__main__": stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, - encoding='utf-8', + encoding=encoding, + errors='replace', # 遇到无法解码的字符时用替换字符代替,避免崩溃 env=env ) @@ -914,16 +957,18 @@ if __name__ == "__main__": print(f"No entry point found for project: {project_path_obj}") return False - venv_path = project_path_obj / ".venv" + # 使用跨平台的虚拟环境查找方法 + venv_path = PlatformUtils.find_venv_path(project_path_obj) + if not venv_path: + print(f"错误: 未找到虚拟环境") + return False print(f"虚拟环境路径: {venv_path}") print(f"脚本路径: {entry_point}") - if not venv_path.exists(): - print(f"错误: 虚拟环境路径不存在: {venv_path}") - if not entry_point.exists(): print(f"错误: 脚本文件不存在: {entry_point}") + return False print(f'target_project_path:{target_project_path}') process, stdout, stderr = self.run_python_in_venv(str(venv_path), str(entry_point), [target_project_path]) @@ -1175,10 +1220,15 @@ if __name__ == "__main__": def check_pycharm_responsive(self): """检查PyCharm是否响应命令""" try: + system = PlatformUtils.get_system_type() + encoding = 'gbk' if system == 'windows' else 'utf-8' + result = subprocess.run( ["pycharm", "--version"], capture_output=True, text=True, + encoding=encoding, + errors='replace', timeout=5 ) if result.returncode == 0: @@ -1236,7 +1286,10 @@ if __name__ == "__main__": try: result = subprocess.run( ['osascript', '-e', 'tell application "System Events" to count windows of process "PyCharm"'], - capture_output=True, text=True + capture_output=True, + text=True, + encoding='utf-8', + errors='replace' ) if result.returncode == 0 and result.stdout.strip().isdigit(): window_count = int(result.stdout.strip()) @@ -1250,7 +1303,10 @@ if __name__ == "__main__": try: result = subprocess.run( ['xdotool', 'search', '--name', 'PyCharm'], - capture_output=True, text=True + capture_output=True, + text=True, + encoding='utf-8', + errors='replace' ) if result.returncode == 0 and result.stdout.strip(): return True diff --git a/MetaCore/main.py b/MetaCore/main.py index b1bf59e..235e135 100644 --- a/MetaCore/main.py +++ b/MetaCore/main.py @@ -13,10 +13,10 @@ from PyQt5.QtCore import * from PyQt5.QtGui import * # 导入自定义组件 -from MetaCore.ui.main_window import MainWindow -from MetaCore.ui.styles import StyleSheet +from ui.main_window import MainWindow +from ui.styles import StyleSheet -from MetaCore.data.project_manager import ProjectManager +from data.project_manager import ProjectManager class MetaCoreApp(QApplication): """MetaCore应用程序主类""" @@ -54,11 +54,12 @@ class MetaCoreApp(QApplication): def main(): """主函数""" - app = MetaCoreApp(sys.argv) + # 设置高DPI支持(必须在创建 QApplication 之前设置) + QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) + QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) - # 设置高DPI支持 - app.setAttribute(Qt.AA_EnableHighDpiScaling, True) - app.setAttribute(Qt.AA_UseHighDpiPixmaps, True) + # 创建应用程序 + app = MetaCoreApp(sys.argv) # 运行应用程序 sys.exit(app.exec_()) diff --git a/MetaCore/ui/create_project_dialog.py b/MetaCore/ui/create_project_dialog.py index 93322f0..18f31e4 100644 --- a/MetaCore/ui/create_project_dialog.py +++ b/MetaCore/ui/create_project_dialog.py @@ -9,7 +9,7 @@ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * -from MetaCore.data.project_manager import ProjectManager +from data.project_manager import ProjectManager class CreateProjectDialog(QDialog): """创建项目对话框""" diff --git a/MetaCore/ui/import_project_dialog.py b/MetaCore/ui/import_project_dialog.py index c16fe48..9e94aea 100644 --- a/MetaCore/ui/import_project_dialog.py +++ b/MetaCore/ui/import_project_dialog.py @@ -9,7 +9,7 @@ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * -from MetaCore.data.project_manager import ProjectManager +from data.project_manager import ProjectManager class ImportProjectDialog(QDialog): """导入项目对话框""" diff --git a/MetaCore/ui/main_window.py b/MetaCore/ui/main_window.py index fec6fe3..c987044 100644 --- a/MetaCore/ui/main_window.py +++ b/MetaCore/ui/main_window.py @@ -8,13 +8,13 @@ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * -from MetaCore.ui.sidebar import Sidebar -from MetaCore.ui.project_area import ProjectArea -from MetaCore.ui.create_project_dialog import CreateProjectDialog -from MetaCore.ui.import_project_dialog import ImportProjectDialog -from MetaCore.ui.project_settings_page import ProjectSettingsPage -from MetaCore.data.project_manager import ProjectManager -from MetaCore.ui.icon_manager import IconManager +from ui.sidebar import Sidebar +from ui.project_area import ProjectArea +from ui.create_project_dialog import CreateProjectDialog +from ui.import_project_dialog import ImportProjectDialog +from ui.project_settings_page import ProjectSettingsPage +from data.project_manager import ProjectManager +from ui.icon_manager import IconManager class MainWindow(QMainWindow): """主窗口类""" diff --git a/MetaCore/ui/project_area.py b/MetaCore/ui/project_area.py index 9e9d79a..62341c9 100644 --- a/MetaCore/ui/project_area.py +++ b/MetaCore/ui/project_area.py @@ -9,9 +9,9 @@ from PyQt5.QtCore import * from PyQt5.QtGui import * from typing import List -from MetaCore.data.project_manager import ProjectManager, Project -from MetaCore.ui.icon_manager import IconManager -from MetaCore.ui.project_card import ProjectCard +from data.project_manager import ProjectManager, Project +from ui.icon_manager import IconManager +from ui.project_card import ProjectCard class ProjectArea(QWidget): """项目区域组件""" diff --git a/MetaCore/ui/project_card.py b/MetaCore/ui/project_card.py index c6ede94..de6671c 100644 --- a/MetaCore/ui/project_card.py +++ b/MetaCore/ui/project_card.py @@ -13,9 +13,9 @@ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * -from MetaCore.data.project_manager import ProjectManager, Project -from MetaCore.ui.icon_manager import IconManager -from MetaCore.ui.project_settings_page import ProjectSettingsPage +from data.project_manager import ProjectManager, Project +from ui.icon_manager import IconManager +from ui.project_settings_page import ProjectSettingsPage class ImageDisplayWidget(QWidget): """ 一个专门用于显示带圆角图片的控件。 diff --git a/MetaCore/ui/sidebar.py b/MetaCore/ui/sidebar.py index 6b60988..f25eb58 100644 --- a/MetaCore/ui/sidebar.py +++ b/MetaCore/ui/sidebar.py @@ -8,8 +8,8 @@ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * -from MetaCore.data.project_manager import ProjectManager -from MetaCore.ui.icon_manager import IconManager +from data.project_manager import ProjectManager +from ui.icon_manager import IconManager class Sidebar(QWidget): """侧边栏组件""" diff --git a/data/projects.json b/data/projects.json index 108f253..e4939e6 100644 --- a/data/projects.json +++ b/data/projects.json @@ -1,57 +1,13 @@ [ { - "id": 1, - "title": "智慧工厂", - "date": "2024-06-08 15:56:35", - "type": "industrial", - "image": "🏭", - "path": "", - "project_dir": "", - "description": "", - "status": "normal" - }, - { - "id": 2, - "title": "智慧水务", - "date": "2023-01-10 12:09:04", - "type": "smart", - "image": "💧", - "path": "", - "project_dir": "", - "description": "", - "status": "normal" - }, - { - "id": 3, - "title": "数字工厂", - "date": "2024-06-07 06:57:46", - "type": "industrial", - "image": "🏗️", - "path": "", - "project_dir": "", - "description": "", - "status": "normal" - }, - { - "id": 4, - "title": "智慧监控", - "date": "2024-07-28 17:38:02", - "type": "smart", - "image": "📊", - "path": "", - "project_dir": "", - "description": "", - "status": "normal" - }, - { - "id": 5, - "title": "工业设计平台", - "date": "2025-02-28 18:00:05", - "type": "design", - "image": "🎨", - "path": "", - "project_dir": "", - "description": "", + "id": 6, + "title": "XNWX", + "date": "2025-10-11 12:15:15", + "type": "imported", + "image": "C:\\Users\\29381\\Desktop\\XNWX\\XNWX.png", + "path": "C:\\Users\\29381\\Desktop", + "project_dir": "C:\\Users\\29381\\Desktop\\XNWX", + "description": "从文件夹 XNWX 导入", "status": "normal" } ] \ No newline at end of file