Skip to content

Commit 8adcd2f

Browse files
committed
Add PyEnvComboBox to main widget
1 parent 21e6239 commit 8adcd2f

4 files changed

Lines changed: 44 additions & 12 deletions

File tree

src/py2exe_gui/Constants/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
from .app_constants import *
99
from .packaging_constants import *
1010
from .platform_constants import *
11+
from .python_env_constants import *

src/py2exe_gui/Widgets/center_widget.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from ..Constants import PyinstallerArgs
2222
from .arguments_browser import ArgumentsBrowser
2323
from .dialog_widgets import IconFileDlg, ScriptFileDlg
24+
from .pyenv_combobox import PyEnvComboBox
2425

2526

2627
class CenterWidget(QWidget):
@@ -46,6 +47,9 @@ def __init__(self, parent: QMainWindow) -> None:
4647
self.script_browse_btn = QPushButton()
4748
self.script_path_le = QLineEdit()
4849

50+
# Python 解释器选择下拉框
51+
self.pyenv_combobox = PyEnvComboBox()
52+
4953
# 打包后输出的项目名称
5054
self.project_name_label = QLabel()
5155
self.project_name_le = QLineEdit()
@@ -178,6 +182,7 @@ def _set_layout(self) -> None:
178182
self.main_layout = main_layout
179183
main_layout.addSpacing(10)
180184
main_layout.addLayout(script_layout)
185+
main_layout.addWidget(self.pyenv_combobox)
181186
main_layout.addStretch(10)
182187
main_layout.addLayout(name_layout)
183188
main_layout.addStretch(10)
@@ -316,14 +321,19 @@ def icon_file_selected(file_path: str) -> None:
316321
self.console_checkbox.toggled.connect(console_selected)
317322

318323
def _set_layout(self) -> None:
324+
"""
325+
设置布局管理器 \n
326+
"""
327+
319328
super()._set_layout()
320-
self.main_layout.insertWidget(6, self.console_checkbox)
329+
330+
self.main_layout.insertWidget(7, self.console_checkbox)
321331
self.main_layout.addStretch(10)
322332
icon_layout = QGridLayout()
323333
icon_layout.addWidget(self.icon_path_label, 0, 0, 1, 2)
324334
icon_layout.addWidget(self.icon_path_le, 1, 0)
325335
icon_layout.addWidget(self.icon_browse_btn, 1, 1)
326-
self.main_layout.insertLayout(7, icon_layout)
336+
self.main_layout.insertLayout(8, icon_layout)
327337

328338
@QtCore.Slot(tuple)
329339
def handle_option_set(self, option: tuple[PyinstallerArgs, str]) -> None:
Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from PySide6.QtGui import QIcon
1010
from PySide6.QtWidgets import QComboBox, QWidget
1111

12-
from ..Constants.python_env_constants import PyEnv, PyEnvType, get_pyenv_version
12+
from ..Constants import RUNTIME_INFO, PyEnv, PyEnvType, get_pyenv_version
13+
from ..Utilities import get_sys_python
1314

1415

1516
class PyEnvComboBox(QComboBox):
@@ -22,21 +23,27 @@ def __init__(self, parent: Optional[QWidget] = None):
2223

2324
self.setIconSize(QSize(18, 18))
2425

26+
if not RUNTIME_INFO.is_bundled:
27+
# 在非 PyInstaller 捆绑环境中,第一项为当前用于运行 Py2exe-GUI 的 Python 环境
28+
current_pyenv = PyEnv(PyEnvType.poetry, executable_path=sys.executable)
29+
self.addItem(*self.gen_item(current_pyenv))
30+
else:
31+
# 若已由 PyInstaller 捆绑成冻结应用程序,则第一项为系统 Python 环境
32+
sys_pyenv = PyEnv(PyEnvType.system, executable_path=get_sys_python())
33+
self.addItem(*self.gen_item(sys_pyenv))
34+
35+
# 测试项
2536
self.addItem(
2637
QIcon(":/Icons/Python_128px"),
2738
f"Python {platform.python_version()}",
2839
sys.executable,
2940
)
3041

31-
self.addItem(
32-
*self.gen_item(PyEnv(PyEnvType.poetry, executable_path=sys.executable))
33-
)
34-
3542
@classmethod
3643
def gen_item(cls, pyenv: PyEnv) -> tuple:
3744
"""
38-
根据传入的Python环境,生成一个适用于 QComboBox.addItem() 参数的三元素元组 \n
39-
:param pyenv: Python解释器环境
45+
根据传入的 Python 环境,生成一个适用于 QComboBox.addItem() 参数的三元素元组 \n
46+
:param pyenv: Python 解释器环境
4047
:return: (icon, text, data)
4148
"""
4249

@@ -45,13 +52,13 @@ def gen_item(cls, pyenv: PyEnv) -> tuple:
4552

4653
if pyenv.type == PyEnvType.system:
4754
icon = QIcon(":/Icons/Python_128px")
48-
text = f"Python {version}"
55+
text = f"Python {version} (System)"
4956
elif pyenv.type == PyEnvType.poetry:
5057
icon = QIcon(":/Icons/Poetry")
51-
text = f"Poetry[Python {version}]"
58+
text = f"Poetry [Python {version}]"
5259
elif pyenv.type == PyEnvType.conda:
5360
icon = QIcon(":/Icons/Conda")
54-
text = f"Conda[Python {version}]"
61+
text = f"Conda [Python {version}]"
5562
else:
5663
icon = QIcon(":/Icons/Python_128px")
5764
text = f"Python {version}"

src/py2exe_gui/__main__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def _connect_slots(self) -> None:
3737

3838
self._connect_run_pkg_btn_slot()
3939
self._connect_mul_btn_slot(self.subprocess_dlg)
40+
self._connect_pyenv_change()
4041

4142
self.center_widget.option_selected.connect(self.packaging_task.handle_option)
4243
self.packaging_task.option_set.connect(self.packager.set_pyinstaller_args)
@@ -57,6 +58,18 @@ def _connect_slots(self) -> None:
5758
lambda: self.packager.subprocess.abort_process(2000)
5859
)
5960

61+
def _connect_pyenv_change(self):
62+
"""
63+
处理用户通过选择不同的 Python 解释器时的响应
64+
"""
65+
66+
self.packager.set_pyinstaller(self.center_widget.pyenv_combobox.currentData())
67+
self.center_widget.pyenv_combobox.currentIndexChanged.connect(
68+
lambda: self.packager.set_pyinstaller(
69+
self.center_widget.pyenv_combobox.currentData()
70+
)
71+
)
72+
6073
def _connect_mul_btn_slot(self, subprocess_dlg):
6174
@Slot()
6275
def handle_multifunction() -> None:
@@ -109,6 +122,7 @@ def closeEvent(self, event: QCloseEvent) -> None:
109122
def main() -> None:
110123
"""
111124
应用程序主入口函数
125+
便于 Poetry 由此函数级入口构建启动脚本 \n
112126
"""
113127

114128
app = QApplication(sys.argv)

0 commit comments

Comments
 (0)