diff --git a/src/py2exe_gui/Constants/platform_constants.py b/src/py2exe_gui/Constants/platform_constants.py index 1104316..bace60d 100644 --- a/src/py2exe_gui/Constants/platform_constants.py +++ b/src/py2exe_gui/Constants/platform_constants.py @@ -31,22 +31,3 @@ def get_platform() -> PLATFORM: return PLATFORM.macos else: return PLATFORM.others - - -# 以全局变量形式,保存当前运行时的平台信息 -RUNTIME_PLATFORM = get_platform() - -# 各平台的命令行续行符 -line_continuation_text = {"shell": "\\", "cmd": "^", "powershell": "`"} - - -def get_line_continuation() -> str: - """ - 获取当前运行平台对应的命令行续行符 \n - :return: line continuation character - """ - - if PLATFORM.windows == RUNTIME_PLATFORM: - return line_continuation_text["powershell"] - else: - return line_continuation_text["shell"] diff --git a/src/py2exe_gui/Core/__init__.py b/src/py2exe_gui/Core/__init__.py index ed66c5f..7a24b86 100644 --- a/src/py2exe_gui/Core/__init__.py +++ b/src/py2exe_gui/Core/__init__.py @@ -3,4 +3,5 @@ from .packaging import Packaging from .packaging_task import PackagingTask +from .runtime_info import RUNTIME_INFO from .validators import FilePathValidator, InterpreterValidator diff --git a/src/py2exe_gui/Core/runtime_info.py b/src/py2exe_gui/Core/runtime_info.py new file mode 100644 index 0000000..c0315e7 --- /dev/null +++ b/src/py2exe_gui/Core/runtime_info.py @@ -0,0 +1,19 @@ +# Licensed under the GPLv3 License: https://www.gnu.org/licenses/gpl-3.0.html +# For details: https://github.com/muziing/Py2exe-GUI/blob/main/README.md#license + +""" +运行时信息 +""" + +from locale import LC_CTYPE, getlocale +from typing import NamedTuple, Optional + +from ..Constants import PLATFORM, get_platform + + +class RuntimeInfo(NamedTuple): + platform: PLATFORM + language_code: Optional[str] + + +RUNTIME_INFO = RuntimeInfo(get_platform(), getlocale(category=LC_CTYPE)[0]) diff --git a/src/py2exe_gui/Widgets/arguments_browser.py b/src/py2exe_gui/Widgets/arguments_browser.py index 8b4dafa..984afcb 100644 --- a/src/py2exe_gui/Widgets/arguments_browser.py +++ b/src/py2exe_gui/Widgets/arguments_browser.py @@ -5,12 +5,28 @@ from typing import Optional from PySide6.QtWidgets import QTextBrowser, QWidget -from ..Constants import get_line_continuation +from ..Constants import PLATFORM +from ..Core import RUNTIME_INFO # 一组适合浅色背景的颜色 colors = ["#FD6D5A", "#FEB40B", "#6DC354", "#994487", "#518CD8", "#443295"] +def get_line_continuation() -> str: + """ + 获取当前运行平台对应的命令行续行符 \n + :return: line continuation character + """ + + # 各平台的命令行续行符 + line_continuation_text = {"shell": "\\", "cmd": "^", "powershell": "`"} + + if PLATFORM.windows == RUNTIME_INFO.platform: + return line_continuation_text["powershell"] + else: + return line_continuation_text["shell"] + + def wrap_font_tag(raw_text: str, *, color: str, **kwargs): """ 辅助函数,用于为字符添加标签包裹,属性可通过可变关键字参数传入 \n diff --git a/src/py2exe_gui/Widgets/center_widget.py b/src/py2exe_gui/Widgets/center_widget.py index 2a467b3..df7c927 100644 --- a/src/py2exe_gui/Widgets/center_widget.py +++ b/src/py2exe_gui/Widgets/center_widget.py @@ -19,7 +19,8 @@ from PySide6.QtWidgets import ( ) from ..Constants.packaging_constants import PyinstallerArgs -from ..Constants.platform_constants import PLATFORM, RUNTIME_PLATFORM +from ..Constants.platform_constants import PLATFORM +from ..Core import RUNTIME_INFO from .arguments_browser import ArgumentsBrowser from .dialog_widgets import IconFileDlg, ScriptFileDlg @@ -58,7 +59,7 @@ class CenterWidget(QWidget): self.fd_group = QButtonGroup() # 应用图标(仅 Windows 与 macOS) - if RUNTIME_PLATFORM in (PLATFORM.windows, PLATFORM.macos): + if RUNTIME_INFO.platform in (PLATFORM.windows, PLATFORM.macos): self.icon_path_label = QLabel() self.icon_file_dlg = IconFileDlg() self.icon_browse_btn = QPushButton() @@ -67,7 +68,7 @@ class CenterWidget(QWidget): # TODO 重构不同平台功能判断,减少 if RUNTIME_PLATFORM in () 语句重复次数 # 是否为stdio启用终端(仅 Windows 与 macOS) - if RUNTIME_PLATFORM in (PLATFORM.windows, PLATFORM.macos): + if RUNTIME_INFO.platform in (PLATFORM.windows, PLATFORM.macos): self.console_checkbox = QCheckBox() # 清理缓存与临时文件 @@ -103,7 +104,7 @@ class CenterWidget(QWidget): self.fd_group.addButton(self.one_dir_btn, 0) self.fd_group.addButton(self.one_file_btn, 1) - if RUNTIME_PLATFORM in (PLATFORM.windows, PLATFORM.macos): + if RUNTIME_INFO.platform in (PLATFORM.windows, PLATFORM.macos): self.icon_path_label.setText("应用图标:") self.icon_path_le.setReadOnly(True) self.icon_path_le.setPlaceholderText("图标文件路径") @@ -202,18 +203,18 @@ class CenterWidget(QWidget): self.parent().packager.run_packaging_process() # 连接信号与槽 - self.script_browse_btn.clicked.connect(self.script_file_dlg.open) # type: ignore - self.script_file_dlg.fileSelected.connect(script_file_selected) # type: ignore - self.project_name_le.editingFinished.connect(project_name_selected) # type: ignore - self.fd_group.idClicked.connect(one_fd_selected) # type: ignore - self.run_packaging_btn.clicked.connect(run_packaging) # type: ignore + self.script_browse_btn.clicked.connect(self.script_file_dlg.open) + self.script_file_dlg.fileSelected.connect(script_file_selected) + self.project_name_le.editingFinished.connect(project_name_selected) + self.fd_group.idClicked.connect(one_fd_selected) + self.run_packaging_btn.clicked.connect(run_packaging) - if RUNTIME_PLATFORM in (PLATFORM.windows, PLATFORM.macos): - self.icon_browse_btn.clicked.connect(self.icon_file_dlg.open) # type: ignore - self.icon_file_dlg.fileSelected.connect(icon_file_selected) # type: ignore - self.console_checkbox.toggled.connect(console_selected) # type: ignore + if RUNTIME_INFO.platform in (PLATFORM.windows, PLATFORM.macos): + self.icon_browse_btn.clicked.connect(self.icon_file_dlg.open) + self.icon_file_dlg.fileSelected.connect(icon_file_selected) + self.console_checkbox.toggled.connect(console_selected) - self.clean_checkbox.toggled.connect(clean_selected) # type: ignore + self.clean_checkbox.toggled.connect(clean_selected) def _set_layout(self) -> None: """ @@ -243,7 +244,7 @@ class CenterWidget(QWidget): main_layout.addLayout(fd_layout) main_layout.addStretch(10) - if RUNTIME_PLATFORM in (PLATFORM.windows, PLATFORM.macos): + if RUNTIME_INFO.platform in (PLATFORM.windows, PLATFORM.macos): main_layout.addWidget(self.console_checkbox) main_layout.addStretch(10) icon_layout = QGridLayout() diff --git a/src/py2exe_gui/Widgets/subprocess_widget.py b/src/py2exe_gui/Widgets/subprocess_widget.py index 571906b..82fea57 100644 --- a/src/py2exe_gui/Widgets/subprocess_widget.py +++ b/src/py2exe_gui/Widgets/subprocess_widget.py @@ -14,7 +14,8 @@ from PySide6.QtWidgets import ( QWidget, ) -from ..Constants import PLATFORM, RUNTIME_PLATFORM +from ..Constants import PLATFORM +from ..Core import RUNTIME_INFO from ..Core.subprocess_tool import SubProcessTool @@ -45,7 +46,7 @@ class SubProcessDlg(QDialog): self.setModal(True) # 设置为模态对话框 # 连接信号与槽 - self.multifunction_btn.clicked.connect(self.handle_multifunction) # type: ignore + self.multifunction_btn.clicked.connect(self.handle_multifunction) # 布局管理器 main_layout = QVBoxLayout() @@ -96,12 +97,12 @@ class SubProcessDlg(QDialog): self.close() elif btn_text == "打开输出位置": dist_path = self.parent().packaging_task.script_path.parent / "dist" - if PLATFORM.windows == RUNTIME_PLATFORM: + if PLATFORM.windows == RUNTIME_INFO.platform: from os import startfile as os_startfile # fmt: skip os_startfile(dist_path) # noqa - elif PLATFORM.linux == RUNTIME_PLATFORM: + elif PLATFORM.linux == RUNTIME_INFO.platform: subprocess.call(["xdg-open", dist_path]) - elif PLATFORM.macos == RUNTIME_PLATFORM: + elif PLATFORM.macos == RUNTIME_INFO.platform: subprocess.call(["open", dist_path]) elif btn_text == "关闭": self.close() diff --git a/src/py2exe_gui/__main__.py b/src/py2exe_gui/__main__.py index 792c92b..d273148 100644 --- a/src/py2exe_gui/__main__.py +++ b/src/py2exe_gui/__main__.py @@ -6,7 +6,6 @@ import sys from PySide6.QtGui import QCloseEvent from PySide6.QtWidgets import QApplication -from .Constants.platform_constants import RUNTIME_PLATFORM # noqa from .Core import Packaging, PackagingTask # noqa from .Resources import compiled_resources # noqa from .Widgets import MainWindow, SubProcessDlg # noqa @@ -57,7 +56,7 @@ class MainApp(MainWindow): super().closeEvent(event) -def main(): +def main() -> None: """ 应用程序主入口函数 """