je-editor 0.0.222__py3-none-any.whl → 0.0.224__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of je-editor might be problematic. Click here for more details.
- je_editor/__init__.py +2 -2
- je_editor/git_client/commit_graph.py +7 -7
- je_editor/git_client/git_action.py +0 -7
- je_editor/pyside_ui/browser/browser_view.py +16 -4
- je_editor/pyside_ui/browser/browser_widget.py +43 -29
- je_editor/pyside_ui/browser/main_browser_widget.py +85 -0
- je_editor/pyside_ui/code/auto_save/auto_save_manager.py +34 -2
- je_editor/pyside_ui/code/auto_save/auto_save_thread.py +19 -6
- je_editor/pyside_ui/code/code_format/pep8_format.py +53 -9
- je_editor/pyside_ui/code/code_process/code_exec.py +88 -52
- je_editor/pyside_ui/code/plaintext_code_edit/code_edit_plaintext.py +116 -55
- je_editor/pyside_ui/code/running_process_manager.py +19 -1
- je_editor/pyside_ui/code/shell_process/shell_exec.py +71 -48
- je_editor/pyside_ui/code/syntax/python_syntax.py +45 -10
- je_editor/pyside_ui/code/syntax/syntax_setting.py +40 -12
- je_editor/pyside_ui/code/textedit_code_result/code_record.py +34 -12
- je_editor/pyside_ui/code/variable_inspector/inspector_gui.py +53 -6
- je_editor/pyside_ui/dialog/ai_dialog/set_ai_dialog.py +30 -3
- je_editor/pyside_ui/dialog/file_dialog/create_file_dialog.py +35 -2
- je_editor/pyside_ui/dialog/file_dialog/open_file_dialog.py +33 -5
- je_editor/pyside_ui/dialog/file_dialog/save_file_dialog.py +25 -3
- je_editor/pyside_ui/dialog/search_ui/search_error_box.py +26 -1
- je_editor/pyside_ui/dialog/search_ui/search_text_box.py +26 -1
- je_editor/pyside_ui/git_ui/code_diff_compare/code_diff_viewer_widget.py +11 -11
- je_editor/pyside_ui/git_ui/git_client/commit_table.py +46 -8
- je_editor/pyside_ui/git_ui/git_client/git_branch_tree_widget.py +49 -15
- je_editor/pyside_ui/git_ui/git_client/git_client_gui.py +81 -16
- je_editor/pyside_ui/git_ui/git_client/graph_view.py +64 -20
- je_editor/pyside_ui/main_ui/ai_widget/ai_config.py +20 -5
- je_editor/pyside_ui/main_ui/ai_widget/ask_thread.py +20 -1
- je_editor/pyside_ui/main_ui/ai_widget/chat_ui.py +56 -41
- je_editor/pyside_ui/main_ui/ai_widget/langchain_interface.py +45 -6
- je_editor/pyside_ui/main_ui/console_widget/console_gui.py +44 -12
- je_editor/pyside_ui/main_ui/console_widget/qprocess_adapter.py +34 -13
- je_editor/pyside_ui/main_ui/dock/destroy_dock.py +33 -2
- je_editor/pyside_ui/main_ui/editor/editor_widget.py +104 -20
- je_editor/pyside_ui/main_ui/editor/editor_widget_dock.py +34 -7
- je_editor/pyside_ui/main_ui/editor/process_input.py +38 -11
- je_editor/pyside_ui/main_ui/ipython_widget/rich_jupyter.py +46 -11
- je_editor/pyside_ui/main_ui/main_editor.py +180 -42
- je_editor/pyside_ui/main_ui/menu/check_style_menu/build_check_style_menu.py +51 -28
- je_editor/pyside_ui/main_ui/menu/dock_menu/build_dock_menu.py +83 -36
- je_editor/pyside_ui/main_ui/menu/file_menu/build_file_menu.py +70 -17
- je_editor/pyside_ui/main_ui/menu/help_menu/build_help_menu.py +35 -4
- je_editor/pyside_ui/main_ui/menu/language_menu/build_language_server.py +41 -1
- je_editor/pyside_ui/main_ui/menu/python_env_menu/build_venv_menu.py +100 -42
- je_editor/pyside_ui/main_ui/menu/run_menu/build_run_menu.py +57 -7
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_debug_menu.py +50 -4
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_program_menu.py +52 -6
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_shell_menu.py +44 -4
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/utils.py +23 -1
- je_editor/pyside_ui/main_ui/menu/set_menu_bar.py +37 -12
- je_editor/pyside_ui/main_ui/menu/style_menu/build_style_menu.py +44 -7
- je_editor/pyside_ui/main_ui/menu/tab_menu/build_tab_menu.py +127 -44
- je_editor/pyside_ui/main_ui/menu/text_menu/build_text_menu.py +65 -1
- je_editor/pyside_ui/main_ui/save_settings/setting_utils.py +18 -1
- je_editor/pyside_ui/main_ui/save_settings/user_color_setting_file.py +33 -3
- je_editor/pyside_ui/main_ui/save_settings/user_setting_file.py +38 -11
- je_editor/pyside_ui/main_ui/system_tray/extend_system_tray.py +39 -2
- je_editor/start_editor.py +26 -1
- je_editor/utils/encodings/python_encodings.py +101 -98
- je_editor/utils/file/open/open_file.py +36 -19
- je_editor/utils/file/save/save_file.py +35 -14
- je_editor/utils/json/json_file.py +29 -14
- je_editor/utils/json_format/json_process.py +33 -2
- je_editor/utils/logging/loggin_instance.py +38 -8
- je_editor/utils/multi_language/multi_language_wrapper.py +29 -4
- je_editor/utils/redirect_manager/redirect_manager_class.py +49 -11
- je_editor/utils/venv_check/check_venv.py +45 -15
- {je_editor-0.0.222.dist-info → je_editor-0.0.224.dist-info}/METADATA +1 -1
- {je_editor-0.0.222.dist-info → je_editor-0.0.224.dist-info}/RECORD +74 -74
- je_editor/git_client/github.py +0 -81
- {je_editor-0.0.222.dist-info → je_editor-0.0.224.dist-info}/WHEEL +0 -0
- {je_editor-0.0.222.dist-info → je_editor-0.0.224.dist-info}/licenses/LICENSE +0 -0
- {je_editor-0.0.222.dist-info → je_editor-0.0.224.dist-info}/top_level.txt +0 -0
|
@@ -1,70 +1,94 @@
|
|
|
1
|
+
# 匯入未來功能,允許延遲型別註解 (Python 3.7+ 常用)
|
|
2
|
+
# Import future feature: postponed evaluation of type annotations
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
5
|
+
# 僅用於型別檢查,避免循環匯入
|
|
6
|
+
# For type checking only (avoids circular imports)
|
|
3
7
|
from typing import TYPE_CHECKING
|
|
4
8
|
|
|
9
|
+
# 匯入顏色設定,用於輸出訊息時的字體顏色
|
|
10
|
+
# Import color settings for console/text output
|
|
5
11
|
from je_editor.pyside_ui.main_ui.save_settings.user_color_setting_file import actually_color_dict
|
|
6
12
|
|
|
13
|
+
# 匯入編輯器元件
|
|
14
|
+
# Import EditorWidget
|
|
7
15
|
from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
|
|
16
|
+
|
|
17
|
+
# 匯入使用者設定字典,用來保存 Python 解譯器與環境設定
|
|
18
|
+
# Import user settings dictionary for saving Python interpreter and environment settings
|
|
8
19
|
from je_editor.pyside_ui.main_ui.save_settings.user_setting_file import user_setting_dict
|
|
20
|
+
|
|
21
|
+
# 匯入日誌紀錄器
|
|
22
|
+
# Import logger instance
|
|
9
23
|
from je_editor.utils.logging.loggin_instance import jeditor_logger
|
|
10
24
|
|
|
25
|
+
# 僅在型別檢查時匯入 EditorMain,避免循環依賴
|
|
26
|
+
# Import EditorMain only for type checking (avoids circular dependency)
|
|
11
27
|
if TYPE_CHECKING:
|
|
12
28
|
from je_editor.pyside_ui.main_ui.main_editor import EditorMain
|
|
29
|
+
|
|
13
30
|
import os
|
|
14
31
|
from pathlib import Path
|
|
15
32
|
|
|
33
|
+
# 匯入 Qt 動作、快捷鍵、文字格式、訊息框、輸入框、檔案對話框
|
|
34
|
+
# Import QAction, QKeySequence, QTextCharFormat, QMessageBox, QInputDialog, QFileDialog
|
|
16
35
|
from PySide6.QtGui import QAction, QKeySequence, QTextCharFormat
|
|
17
36
|
from PySide6.QtWidgets import QMessageBox, QInputDialog, QFileDialog
|
|
18
37
|
|
|
38
|
+
# 匯入 ShellManager,用於執行系統命令 (建立 venv、pip install 等)
|
|
39
|
+
# Import ShellManager for executing shell commands (create venv, pip install, etc.)
|
|
19
40
|
from je_editor.pyside_ui.code.shell_process.shell_exec import ShellManager
|
|
20
41
|
|
|
42
|
+
# 匯入多語言包裝器,用於 UI 多語言顯示
|
|
43
|
+
# Import multi-language wrapper for UI localization
|
|
21
44
|
from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
|
|
22
45
|
|
|
23
46
|
|
|
47
|
+
# 設定 Python 環境選單 (venv menu)
|
|
48
|
+
# Set up the Python Environment (venv) menu
|
|
24
49
|
def set_venv_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
25
50
|
jeditor_logger.info(f"build_venv_menu.py set_venv_menu ui_we_want_to_set: {ui_we_want_to_set}")
|
|
26
51
|
ui_we_want_to_set.venv_menu = ui_we_want_to_set.menu.addMenu(
|
|
27
52
|
language_wrapper.language_word_dict.get("python_env_menu_label"))
|
|
28
|
-
|
|
53
|
+
|
|
54
|
+
# 建立虛擬環境 (Ctrl+Shift+V)
|
|
55
|
+
# Create virtual environment
|
|
29
56
|
ui_we_want_to_set.venv_menu.change_language_menu = QAction(
|
|
30
57
|
language_wrapper.language_word_dict.get("python_env_menu_create_venv_label"))
|
|
31
|
-
ui_we_want_to_set.venv_menu.change_language_menu.setShortcut(
|
|
32
|
-
QKeySequence("Ctrl+Shift+V")
|
|
33
|
-
)
|
|
58
|
+
ui_we_want_to_set.venv_menu.change_language_menu.setShortcut(QKeySequence("Ctrl+Shift+V"))
|
|
34
59
|
ui_we_want_to_set.venv_menu.change_language_menu.triggered.connect(
|
|
35
|
-
lambda: create_venv(ui_we_want_to_set)
|
|
36
|
-
)
|
|
60
|
+
lambda: create_venv(ui_we_want_to_set))
|
|
37
61
|
ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.change_language_menu)
|
|
62
|
+
|
|
63
|
+
# pip 升級套件 (Ctrl+Shift+U)
|
|
38
64
|
# pip upgrade package
|
|
39
65
|
ui_we_want_to_set.venv_menu.pip_upgrade_action = QAction(
|
|
40
|
-
language_wrapper.language_word_dict.get("python_env_menu_pip_upgrade_label")
|
|
41
|
-
)
|
|
42
|
-
ui_we_want_to_set.venv_menu.pip_upgrade_action.setShortcut(
|
|
43
|
-
QKeySequence("Ctrl+Shift+U")
|
|
44
|
-
)
|
|
66
|
+
language_wrapper.language_word_dict.get("python_env_menu_pip_upgrade_label"))
|
|
67
|
+
ui_we_want_to_set.venv_menu.pip_upgrade_action.setShortcut(QKeySequence("Ctrl+Shift+U"))
|
|
45
68
|
ui_we_want_to_set.venv_menu.pip_upgrade_action.triggered.connect(
|
|
46
|
-
lambda: pip_install_package_update(ui_we_want_to_set)
|
|
47
|
-
)
|
|
69
|
+
lambda: pip_install_package_update(ui_we_want_to_set))
|
|
48
70
|
ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.pip_upgrade_action)
|
|
49
|
-
|
|
71
|
+
|
|
72
|
+
# pip 安裝套件 (Ctrl+Shift+P)
|
|
73
|
+
# pip install package
|
|
50
74
|
ui_we_want_to_set.venv_menu.pip_action = QAction(
|
|
51
75
|
language_wrapper.language_word_dict.get("python_env_menu_pip_label"))
|
|
52
|
-
ui_we_want_to_set.venv_menu.pip_action.setShortcut(
|
|
53
|
-
QKeySequence("Ctrl+Shift+P")
|
|
54
|
-
)
|
|
76
|
+
ui_we_want_to_set.venv_menu.pip_action.setShortcut(QKeySequence("Ctrl+Shift+P"))
|
|
55
77
|
ui_we_want_to_set.venv_menu.pip_action.triggered.connect(
|
|
56
|
-
lambda: pip_install_package(ui_we_want_to_set)
|
|
57
|
-
)
|
|
78
|
+
lambda: pip_install_package(ui_we_want_to_set))
|
|
58
79
|
ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.pip_action)
|
|
59
|
-
|
|
80
|
+
|
|
81
|
+
# 選擇 Python 解譯器
|
|
82
|
+
# Choose Python interpreter
|
|
60
83
|
ui_we_want_to_set.venv_menu.choose_interpreter_action = QAction(
|
|
61
84
|
language_wrapper.language_word_dict.get("python_env_menu_choose_interpreter_label"))
|
|
62
85
|
ui_we_want_to_set.venv_menu.choose_interpreter_action.triggered.connect(
|
|
63
|
-
lambda: chose_python_interpreter(ui_we_want_to_set)
|
|
64
|
-
)
|
|
86
|
+
lambda: chose_python_interpreter(ui_we_want_to_set))
|
|
65
87
|
ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.choose_interpreter_action)
|
|
66
88
|
|
|
67
89
|
|
|
90
|
+
# 建立虛擬環境
|
|
91
|
+
# Create virtual environment
|
|
68
92
|
def create_venv(ui_we_want_to_set: EditorMain) -> None:
|
|
69
93
|
jeditor_logger.info(f"build_venv_menu.py create_venv ui_we_want_to_set: {ui_we_want_to_set}")
|
|
70
94
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
@@ -72,25 +96,31 @@ def create_venv(ui_we_want_to_set: EditorMain) -> None:
|
|
|
72
96
|
widget.python_compiler = ui_we_want_to_set.python_compiler
|
|
73
97
|
venv_path = Path(os.getcwd() + "/venv")
|
|
74
98
|
if not venv_path.exists():
|
|
99
|
+
# 使用 ShellManager 執行 python -m venv venv
|
|
100
|
+
# Use ShellManager to run python -m venv venv
|
|
75
101
|
create_venv_shell = ShellManager(main_window=widget, after_done_function=widget.code_edit.check_env,
|
|
76
102
|
shell_encoding=ui_we_want_to_set.encoding)
|
|
77
103
|
create_venv_shell.later_init()
|
|
78
|
-
create_venv_shell.exec_shell(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
104
|
+
create_venv_shell.exec_shell([f"{create_venv_shell.compiler_path}", "-m", "venv", "venv"])
|
|
105
|
+
|
|
106
|
+
# 在編輯器輸出區顯示訊息
|
|
107
|
+
# Show message in editor output area
|
|
108
|
+
text_cursor = widget.code_result.textCursor()
|
|
82
109
|
text_format = QTextCharFormat()
|
|
83
110
|
text_format.setForeground(actually_color_dict.get("normal_output_color"))
|
|
84
|
-
text_cursor.insertText(
|
|
85
|
-
|
|
111
|
+
text_cursor.insertText(language_wrapper.language_word_dict.get("python_env_menu_creating_venv_message"),
|
|
112
|
+
text_format)
|
|
86
113
|
text_cursor.insertBlock()
|
|
87
114
|
else:
|
|
115
|
+
# 如果 venv 已存在,顯示提示訊息
|
|
116
|
+
# If venv exists, show message
|
|
88
117
|
message_box = QMessageBox()
|
|
89
|
-
message_box.setText(
|
|
90
|
-
language_wrapper.language_word_dict.get("python_env_menu_venv_exists"))
|
|
118
|
+
message_box.setText(language_wrapper.language_word_dict.get("python_env_menu_venv_exists"))
|
|
91
119
|
message_box.exec()
|
|
92
120
|
|
|
93
121
|
|
|
122
|
+
# 使用 pip 安裝套件 (通用函式)
|
|
123
|
+
# Run pip install command (general function)
|
|
94
124
|
def shell_pip_install(ui_we_want_to_set: EditorMain, pip_install_command_list: list):
|
|
95
125
|
jeditor_logger.info("build_venv_menu.py create_venv "
|
|
96
126
|
f"ui_we_want_to_set: {ui_we_want_to_set} "
|
|
@@ -100,10 +130,14 @@ def shell_pip_install(ui_we_want_to_set: EditorMain, pip_install_command_list: l
|
|
|
100
130
|
widget.python_compiler = ui_we_want_to_set.python_compiler
|
|
101
131
|
venv_path = Path(os.getcwd() + "/venv")
|
|
102
132
|
if not venv_path.exists():
|
|
133
|
+
# 如果 venv 不存在,提醒使用者先建立
|
|
134
|
+
# If venv does not exist, remind user to create it first
|
|
103
135
|
message_box = QMessageBox()
|
|
104
136
|
message_box.setText(language_wrapper.language_word_dict.get("python_env_menu_please_create_venv"))
|
|
105
137
|
message_box.exec()
|
|
106
138
|
else:
|
|
139
|
+
# 彈出輸入框,讓使用者輸入套件名稱
|
|
140
|
+
# Ask user to input package name
|
|
107
141
|
ask_package_dialog = QInputDialog()
|
|
108
142
|
package_text, press_ok = ask_package_dialog.getText(
|
|
109
143
|
ui_we_want_to_set,
|
|
@@ -113,11 +147,11 @@ def shell_pip_install(ui_we_want_to_set: EditorMain, pip_install_command_list: l
|
|
|
113
147
|
if press_ok:
|
|
114
148
|
pip_install_shell = ShellManager(main_window=widget, shell_encoding=ui_we_want_to_set.encoding)
|
|
115
149
|
pip_install_shell.later_init()
|
|
116
|
-
pip_install_shell.exec_shell(
|
|
117
|
-
pip_install_command_list
|
|
118
|
-
)
|
|
150
|
+
pip_install_shell.exec_shell(pip_install_command_list)
|
|
119
151
|
|
|
120
152
|
|
|
153
|
+
# 偵測 venv 是否存在
|
|
154
|
+
# Detect if venv exists
|
|
121
155
|
def detect_venv() -> bool:
|
|
122
156
|
jeditor_logger.info("build_venv_menu.py detect_venv")
|
|
123
157
|
venv_path = Path(os.getcwd() + "/venv")
|
|
@@ -126,15 +160,17 @@ def detect_venv() -> bool:
|
|
|
126
160
|
message_box.setText(language_wrapper.language_word_dict.get("python_env_menu_please_create_venv"))
|
|
127
161
|
message_box.exec()
|
|
128
162
|
return False
|
|
129
|
-
return True
|
|
130
|
-
|
|
131
163
|
|
|
164
|
+
# pip 安裝或更新套件
|
|
165
|
+
# pip install or update package
|
|
132
166
|
def pip_install_package_update(ui_we_want_to_set: EditorMain) -> None:
|
|
133
167
|
jeditor_logger.info(f"build_venv_menu.py pip_install_package_update ui_we_want_to_set: {ui_we_want_to_set}")
|
|
134
168
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
135
169
|
if isinstance(widget, EditorWidget):
|
|
136
170
|
widget.python_compiler = ui_we_want_to_set.python_compiler
|
|
137
|
-
if detect_venv:
|
|
171
|
+
if detect_venv():
|
|
172
|
+
# 彈出輸入框,讓使用者輸入要安裝或更新的套件名稱
|
|
173
|
+
# Ask user to input package name to install or update
|
|
138
174
|
ask_package_dialog = QInputDialog()
|
|
139
175
|
package_text, press_ok = ask_package_dialog.getText(
|
|
140
176
|
ui_we_want_to_set,
|
|
@@ -142,20 +178,31 @@ def pip_install_package_update(ui_we_want_to_set: EditorMain) -> None:
|
|
|
142
178
|
language_wrapper.language_word_dict.get("python_env_menu_install_or_update_package_messagebox_label")
|
|
143
179
|
)
|
|
144
180
|
if press_ok:
|
|
145
|
-
|
|
146
|
-
|
|
181
|
+
# 使用 ShellManager 執行 pip install -U
|
|
182
|
+
# Use ShellManager to run pip install -U
|
|
183
|
+
pip_install_shell = ShellManager(
|
|
184
|
+
main_window=widget,
|
|
185
|
+
after_done_function=widget.code_edit.check_env,
|
|
186
|
+
shell_encoding=ui_we_want_to_set.encoding
|
|
187
|
+
)
|
|
147
188
|
pip_install_shell.later_init()
|
|
148
189
|
pip_install_shell.exec_shell(
|
|
149
190
|
[f"{pip_install_shell.compiler_path}", "-m", "pip", "install", f"{package_text}", "-U"]
|
|
150
191
|
)
|
|
151
192
|
|
|
152
193
|
|
|
194
|
+
# pip 安裝套件 (不加 -U)
|
|
195
|
+
# pip install package (without -U)
|
|
153
196
|
def pip_install_package(ui_we_want_to_set: EditorMain) -> None:
|
|
154
197
|
jeditor_logger.info(f"build_venv_menu.py pip_install_package ui_we_want_to_set: {ui_we_want_to_set}")
|
|
155
198
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
156
199
|
if isinstance(widget, EditorWidget):
|
|
157
200
|
widget.python_compiler = ui_we_want_to_set.python_compiler
|
|
158
|
-
|
|
201
|
+
# ⚠️ 同樣需要加上 () 呼叫 detect_venv
|
|
202
|
+
# ⚠️ Same here: should be detect_venv()
|
|
203
|
+
if detect_venv():
|
|
204
|
+
# 彈出輸入框,讓使用者輸入要安裝的套件名稱
|
|
205
|
+
# Ask user to input package name
|
|
159
206
|
ask_package_dialog = QInputDialog()
|
|
160
207
|
package_text, press_ok = ask_package_dialog.getText(
|
|
161
208
|
ui_we_want_to_set,
|
|
@@ -163,14 +210,21 @@ def pip_install_package(ui_we_want_to_set: EditorMain) -> None:
|
|
|
163
210
|
language_wrapper.language_word_dict.get("python_env_menu_install_package_messagebox_label")
|
|
164
211
|
)
|
|
165
212
|
if press_ok:
|
|
166
|
-
|
|
167
|
-
|
|
213
|
+
# 使用 ShellManager 執行 pip install
|
|
214
|
+
# Use ShellManager to run pip install
|
|
215
|
+
pip_install_shell = ShellManager(
|
|
216
|
+
main_window=widget,
|
|
217
|
+
after_done_function=widget.code_edit.check_env,
|
|
218
|
+
shell_encoding=ui_we_want_to_set.encoding
|
|
219
|
+
)
|
|
168
220
|
pip_install_shell.later_init()
|
|
169
221
|
pip_install_shell.exec_shell(
|
|
170
222
|
[f"{pip_install_shell.compiler_path}", "-m", "pip", "install", f"{package_text}"]
|
|
171
223
|
)
|
|
172
224
|
|
|
173
225
|
|
|
226
|
+
# 選擇 Python 解譯器
|
|
227
|
+
# Choose Python interpreter
|
|
174
228
|
def chose_python_interpreter(ui_we_want_to_set: EditorMain):
|
|
175
229
|
jeditor_logger.info(f"build_venv_menu.py chose_python_interpreter ui_we_want_to_set: {ui_we_want_to_set}")
|
|
176
230
|
file_path = QFileDialog().getOpenFileName(
|
|
@@ -178,5 +232,9 @@ def chose_python_interpreter(ui_we_want_to_set: EditorMain):
|
|
|
178
232
|
dir=str(Path.cwd())
|
|
179
233
|
)[0]
|
|
180
234
|
if file_path is not None and file_path != "":
|
|
235
|
+
# 更新主程式的 Python 解譯器路徑
|
|
236
|
+
# Update main editor's Python interpreter path
|
|
181
237
|
ui_we_want_to_set.python_compiler = file_path
|
|
182
|
-
|
|
238
|
+
# 同時更新使用者設定,讓下次啟動時能記住
|
|
239
|
+
# Update user settings so it persists across sessions
|
|
240
|
+
user_setting_dict.update({"python_compiler": file_path})
|
|
@@ -2,61 +2,98 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
|
+
# 匯入 Qt 訊息框
|
|
6
|
+
# Import QMessageBox for showing dialogs
|
|
5
7
|
from PySide6.QtWidgets import QMessageBox
|
|
6
8
|
|
|
9
|
+
# 匯入執行中程序管理器,用於統一管理所有程式/除錯器/Shell 執行實例
|
|
10
|
+
# Import run_instance_manager for managing all running processes
|
|
7
11
|
from je_editor.pyside_ui.code.running_process_manager import run_instance_manager
|
|
12
|
+
|
|
13
|
+
# 匯入編輯器元件
|
|
14
|
+
# Import EditorWidget
|
|
8
15
|
from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
|
|
16
|
+
|
|
17
|
+
# 匯入子選單建構函式 (Program / Debug / Shell)
|
|
18
|
+
# Import submenu builders (Program / Debug / Shell)
|
|
9
19
|
from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.build_debug_menu import set_debug_menu
|
|
10
20
|
from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.build_program_menu import set_program_menu
|
|
11
21
|
from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.build_shell_menu import set_shell_menu
|
|
22
|
+
|
|
23
|
+
# 匯入日誌紀錄器
|
|
24
|
+
# Import logger instance
|
|
12
25
|
from je_editor.utils.logging.loggin_instance import jeditor_logger
|
|
13
26
|
|
|
14
27
|
if TYPE_CHECKING:
|
|
15
28
|
from je_editor.pyside_ui.main_ui.main_editor import EditorMain
|
|
29
|
+
|
|
30
|
+
# 匯入 Qt 動作
|
|
31
|
+
# Import QAction
|
|
16
32
|
from PySide6.QtGui import QAction
|
|
17
33
|
|
|
34
|
+
# 匯入多語言包裝器
|
|
35
|
+
# Import multi-language wrapper for UI localization
|
|
18
36
|
from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
|
|
19
37
|
|
|
20
38
|
|
|
39
|
+
# 設定 Run 選單
|
|
40
|
+
# Set up the Run menu
|
|
21
41
|
def set_run_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
22
42
|
jeditor_logger.info(f"build_run_menu.py set_run_menu ui_we_want_to_set: {ui_we_want_to_set}")
|
|
43
|
+
# 建立 Run 選單
|
|
44
|
+
# Create Run menu
|
|
23
45
|
ui_we_want_to_set.run_menu = ui_we_want_to_set.menu.addMenu(
|
|
24
46
|
language_wrapper.language_word_dict.get("run_menu_label"))
|
|
47
|
+
|
|
48
|
+
# 加入子選單:Program / Shell / Debug
|
|
49
|
+
# Add submenus: Program / Shell / Debug
|
|
25
50
|
set_program_menu(ui_we_want_to_set)
|
|
26
51
|
set_shell_menu(ui_we_want_to_set)
|
|
27
52
|
set_debug_menu(ui_we_want_to_set)
|
|
28
|
-
|
|
53
|
+
|
|
54
|
+
# 清除結果
|
|
55
|
+
# Clear execution result
|
|
29
56
|
ui_we_want_to_set.run_menu.clean_result_action = QAction(
|
|
30
57
|
language_wrapper.language_word_dict.get("run_menu_clear_result_label"))
|
|
31
58
|
ui_we_want_to_set.run_menu.clean_result_action.triggered.connect(
|
|
32
59
|
lambda: clean_result(ui_we_want_to_set)
|
|
33
60
|
)
|
|
34
61
|
ui_we_want_to_set.run_menu.addAction(ui_we_want_to_set.run_menu.clean_result_action)
|
|
35
|
-
|
|
62
|
+
|
|
63
|
+
# 停止目前程式
|
|
64
|
+
# Stop current program
|
|
36
65
|
ui_we_want_to_set.run_menu.stop_program_action = QAction(
|
|
37
66
|
language_wrapper.language_word_dict.get("run_menu_stop_program_label"))
|
|
38
67
|
ui_we_want_to_set.run_menu.stop_program_action.triggered.connect(
|
|
39
68
|
lambda: stop_program(ui_we_want_to_set)
|
|
40
69
|
)
|
|
41
70
|
ui_we_want_to_set.run_menu.addAction(ui_we_want_to_set.run_menu.stop_program_action)
|
|
42
|
-
|
|
71
|
+
|
|
72
|
+
# 停止所有程式
|
|
73
|
+
# Stop all programs
|
|
43
74
|
ui_we_want_to_set.run_menu.stop_all_program_action = QAction(
|
|
44
75
|
language_wrapper.language_word_dict.get("run_menu_stop_all_program_label"))
|
|
45
76
|
ui_we_want_to_set.run_menu.stop_all_program_action.triggered.connect(
|
|
46
77
|
stop_all_program
|
|
47
78
|
)
|
|
48
79
|
ui_we_want_to_set.run_menu.addAction(ui_we_want_to_set.run_menu.stop_all_program_action)
|
|
49
|
-
|
|
80
|
+
|
|
81
|
+
# Run 說明子選單
|
|
82
|
+
# Run Help submenu
|
|
50
83
|
ui_we_want_to_set.run_menu.run_help_menu = ui_we_want_to_set.run_menu.addMenu(
|
|
51
84
|
language_wrapper.language_word_dict.get("run_menu_run_help_label"))
|
|
52
|
-
|
|
85
|
+
|
|
86
|
+
# Run 說明動作
|
|
87
|
+
# Run Help action
|
|
53
88
|
ui_we_want_to_set.run_menu.run_help_menu.run_help_action = QAction(
|
|
54
89
|
language_wrapper.language_word_dict.get("run_menu_run_help_label"))
|
|
55
90
|
ui_we_want_to_set.run_menu.run_help_menu.run_help_action.triggered.connect(
|
|
56
91
|
show_run_help
|
|
57
92
|
)
|
|
58
93
|
ui_we_want_to_set.run_menu.run_help_menu.addAction(ui_we_want_to_set.run_menu.run_help_menu.run_help_action)
|
|
59
|
-
|
|
94
|
+
|
|
95
|
+
# Shell 說明動作
|
|
96
|
+
# Shell Help action
|
|
60
97
|
ui_we_want_to_set.run_menu.run_help_menu.shell_help_action = QAction(
|
|
61
98
|
language_wrapper.language_word_dict.get("run_menu_shell_help_label"))
|
|
62
99
|
ui_we_want_to_set.run_menu.run_help_menu.shell_help_action.triggered.connect(
|
|
@@ -65,29 +102,38 @@ def set_run_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
|
65
102
|
ui_we_want_to_set.run_menu.run_help_menu.addAction(ui_we_want_to_set.run_menu.run_help_menu.shell_help_action)
|
|
66
103
|
|
|
67
104
|
|
|
105
|
+
# 停止目前分頁的程式 / Shell / 除錯器
|
|
106
|
+
# Stop current tab's program / shell / debugger
|
|
68
107
|
def stop_program(ui_we_want_to_set: EditorMain) -> None:
|
|
69
108
|
jeditor_logger.info(f"build_run_menu.py stop_program ui_we_want_to_set: {ui_we_want_to_set}")
|
|
70
109
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
71
110
|
if isinstance(widget, EditorWidget):
|
|
111
|
+
# 停止程式
|
|
72
112
|
if widget.exec_program is not None:
|
|
73
113
|
if widget.exec_program.process is not None:
|
|
74
114
|
widget.exec_program.process.terminate()
|
|
75
115
|
widget.exec_program = None
|
|
116
|
+
# 停止 Shell
|
|
76
117
|
if widget.exec_shell is not None:
|
|
77
118
|
if widget.exec_shell.process is not None:
|
|
78
119
|
widget.exec_shell.process.terminate()
|
|
79
120
|
widget.exec_shell = None
|
|
121
|
+
# 停止除錯器
|
|
80
122
|
if widget.exec_python_debugger is not None:
|
|
81
123
|
if widget.exec_python_debugger.process is not None:
|
|
82
124
|
widget.exec_python_debugger.process.terminate()
|
|
83
125
|
widget.exec_python_debugger = None
|
|
84
126
|
|
|
85
127
|
|
|
128
|
+
# 停止所有執行中的程式
|
|
129
|
+
# Stop all running programs
|
|
86
130
|
def stop_all_program() -> None:
|
|
87
131
|
jeditor_logger.info("build_run_menu.py stop_all_program")
|
|
88
132
|
run_instance_manager.close_all_instance()
|
|
89
133
|
|
|
90
134
|
|
|
135
|
+
# 清除目前分頁的輸出結果
|
|
136
|
+
# Clear current tab's output result
|
|
91
137
|
def clean_result(ui_we_want_to_set: EditorMain) -> None:
|
|
92
138
|
jeditor_logger.info(f"build_run_menu.py clean_result ui_we_want_to_set: {ui_we_want_to_set}")
|
|
93
139
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
@@ -95,6 +141,8 @@ def clean_result(ui_we_want_to_set: EditorMain) -> None:
|
|
|
95
141
|
widget.code_result.setPlainText("")
|
|
96
142
|
|
|
97
143
|
|
|
144
|
+
# 顯示 Run 說明
|
|
145
|
+
# Show Run help
|
|
98
146
|
def show_run_help() -> None:
|
|
99
147
|
jeditor_logger.info("build_run_menu.py show_run_help")
|
|
100
148
|
message_box = QMessageBox()
|
|
@@ -104,10 +152,12 @@ def show_run_help() -> None:
|
|
|
104
152
|
message_box.exec()
|
|
105
153
|
|
|
106
154
|
|
|
155
|
+
# 顯示 Shell 說明
|
|
156
|
+
# Show Shell help
|
|
107
157
|
def show_shell_help() -> None:
|
|
108
158
|
jeditor_logger.info("build_run_menu.py show_shell_help")
|
|
109
159
|
message_box = QMessageBox()
|
|
110
160
|
message_box.setText(
|
|
111
161
|
language_wrapper.language_word_dict.get("run_menu_shell_run_tip")
|
|
112
162
|
)
|
|
113
|
-
message_box.exec()
|
|
163
|
+
message_box.exec()
|
|
@@ -1,34 +1,66 @@
|
|
|
1
|
+
# 匯入未來功能,允許延遲型別註解 (Python 3.7+ 常用)
|
|
2
|
+
# Import future feature: postponed evaluation of type annotations
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
5
|
+
# 僅用於型別檢查,避免循環匯入
|
|
6
|
+
# For type checking only (avoids circular imports)
|
|
3
7
|
from typing import TYPE_CHECKING
|
|
4
8
|
|
|
9
|
+
# 匯入編輯器元件與輸入處理
|
|
10
|
+
# Import EditorWidget and ProcessInput
|
|
5
11
|
from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
|
|
6
12
|
from je_editor.pyside_ui.main_ui.editor.process_input import ProcessInput
|
|
13
|
+
|
|
14
|
+
# 匯入工具函式:顯示「請先關閉目前執行中的程式」訊息框
|
|
15
|
+
# Import utility: show message box if a program is already running
|
|
7
16
|
from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.utils import please_close_current_running_messagebox
|
|
17
|
+
|
|
18
|
+
# 匯入日誌紀錄器
|
|
19
|
+
# Import logger instance
|
|
8
20
|
from je_editor.utils.logging.loggin_instance import jeditor_logger
|
|
9
21
|
|
|
22
|
+
# 僅在型別檢查時匯入 EditorMain,避免循環依賴
|
|
23
|
+
# Import EditorMain only for type checking (avoids circular dependency)
|
|
10
24
|
if TYPE_CHECKING:
|
|
11
25
|
from je_editor.pyside_ui.main_ui.main_editor import EditorMain
|
|
26
|
+
|
|
27
|
+
# 匯入 Qt 動作
|
|
28
|
+
# Import QAction
|
|
12
29
|
from PySide6.QtGui import QAction
|
|
13
30
|
|
|
31
|
+
# 匯入程式執行管理器 (ExecManager)
|
|
32
|
+
# Import ExecManager for running/debugging code
|
|
14
33
|
from je_editor.pyside_ui.code.code_process.code_exec import ExecManager
|
|
34
|
+
|
|
35
|
+
# 匯入檔案儲存對話框
|
|
36
|
+
# Import file save dialog
|
|
15
37
|
from je_editor.pyside_ui.dialog.file_dialog.save_file_dialog import choose_file_get_save_file_path
|
|
38
|
+
|
|
39
|
+
# 匯入多語言包裝器
|
|
40
|
+
# Import multi-language wrapper for UI localization
|
|
16
41
|
from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
|
|
17
42
|
|
|
18
43
|
|
|
44
|
+
# 設定 Debug 選單
|
|
45
|
+
# Set up the Debug menu
|
|
19
46
|
def set_debug_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
20
47
|
jeditor_logger.info(f"build_debug_menu.py set_debug_menu ui_we_want_to_set: {ui_we_want_to_set}")
|
|
21
|
-
#
|
|
48
|
+
# 在 Run 選單下建立 Debug 子選單
|
|
49
|
+
# Create Debug submenu under Run menu
|
|
22
50
|
ui_we_want_to_set.debug_menu = ui_we_want_to_set.run_menu.addMenu(
|
|
23
51
|
language_wrapper.language_word_dict.get("editor_debugger_input_title_label"))
|
|
24
|
-
|
|
52
|
+
|
|
53
|
+
# 建立「執行除錯器」動作
|
|
54
|
+
# Add "Run Debugger" action
|
|
25
55
|
ui_we_want_to_set.debug_menu.run_debugger_action = QAction(
|
|
26
56
|
language_wrapper.language_word_dict.get("run_menu_run_debugger"))
|
|
27
57
|
ui_we_want_to_set.debug_menu.run_debugger_action.triggered.connect(
|
|
28
58
|
lambda: run_debugger(ui_we_want_to_set)
|
|
29
59
|
)
|
|
30
60
|
ui_we_want_to_set.debug_menu.addAction(ui_we_want_to_set.debug_menu.run_debugger_action)
|
|
31
|
-
|
|
61
|
+
|
|
62
|
+
# 建立「顯示除錯輸入」動作
|
|
63
|
+
# Add "Show Debugger Input" action
|
|
32
64
|
ui_we_want_to_set.debug_menu.show_shell_input = QAction(
|
|
33
65
|
language_wrapper.language_word_dict.get("show_debugger_input"))
|
|
34
66
|
ui_we_want_to_set.debug_menu.show_shell_input.triggered.connect(
|
|
@@ -37,29 +69,43 @@ def set_debug_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
|
37
69
|
ui_we_want_to_set.debug_menu.addAction(ui_we_want_to_set.debug_menu.show_shell_input)
|
|
38
70
|
|
|
39
71
|
|
|
72
|
+
# 執行除錯器 (pdb)
|
|
73
|
+
# Run debugger (pdb)
|
|
40
74
|
def run_debugger(ui_we_want_to_set: EditorMain) -> None:
|
|
41
75
|
jeditor_logger.info(f"build_debug_menu.py run_debugger ui_we_want_to_set: {ui_we_want_to_set}")
|
|
42
76
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
43
77
|
if isinstance(widget, EditorWidget):
|
|
78
|
+
# 確保沒有正在執行的除錯器
|
|
79
|
+
# Ensure no debugger is already running
|
|
44
80
|
if widget.exec_python_debugger is None:
|
|
45
81
|
widget.python_compiler = ui_we_want_to_set.python_compiler
|
|
82
|
+
# 要求使用者選擇儲存檔案路徑
|
|
83
|
+
# Ask user to choose save file path
|
|
46
84
|
if choose_file_get_save_file_path(ui_we_want_to_set):
|
|
85
|
+
# 建立程式執行管理器,並以 pdb 模式執行
|
|
86
|
+
# Create ExecManager and run with pdb
|
|
47
87
|
code_exec = ExecManager(widget, program_encoding=ui_we_want_to_set.encoding)
|
|
48
88
|
code_exec.later_init()
|
|
49
89
|
code_exec.code_result = widget.debugger_result
|
|
50
90
|
code_exec.exec_code(
|
|
51
91
|
widget.current_file, exec_prefix=["-m", "pdb"]
|
|
52
92
|
)
|
|
93
|
+
# 綁定除錯器與輸入介面
|
|
94
|
+
# Bind debugger and input interface
|
|
53
95
|
widget.exec_python_debugger = code_exec
|
|
54
96
|
widget.debugger_input = ProcessInput(widget)
|
|
55
97
|
widget.debugger_input.show()
|
|
56
98
|
else:
|
|
99
|
+
# 如果已有程式在執行,顯示提示訊息
|
|
100
|
+
# If a program is already running, show message
|
|
57
101
|
please_close_current_running_messagebox(ui_we_want_to_set)
|
|
58
102
|
|
|
59
103
|
|
|
104
|
+
# 顯示除錯輸入介面
|
|
105
|
+
# Show debugger input interface
|
|
60
106
|
def show_debugger_input(ui_we_want_to_set: EditorMain) -> None:
|
|
61
107
|
jeditor_logger.info(f"build_debug_menu.py show_debugger_input ui_we_want_to_set: {ui_we_want_to_set}")
|
|
62
108
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
63
109
|
if isinstance(widget, EditorWidget):
|
|
64
110
|
widget.debugger_input = ProcessInput(widget, "debugger")
|
|
65
|
-
widget.debugger_input.show()
|
|
111
|
+
widget.debugger_input.show()
|
|
@@ -1,33 +1,69 @@
|
|
|
1
|
+
# 匯入未來功能,允許延遲型別註解 (Python 3.7+ 常用)
|
|
2
|
+
# Import future feature: postponed evaluation of type annotations
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
5
|
+
# 僅用於型別檢查,避免循環匯入
|
|
6
|
+
# For type checking only (avoids circular imports)
|
|
3
7
|
from typing import TYPE_CHECKING
|
|
4
8
|
|
|
9
|
+
# 匯入 Qt 動作
|
|
10
|
+
# Import QAction
|
|
5
11
|
from PySide6.QtGui import QAction
|
|
6
12
|
|
|
13
|
+
# 匯入程式執行管理器 (ExecManager)
|
|
14
|
+
# Import ExecManager for running code
|
|
7
15
|
from je_editor.pyside_ui.code.code_process.code_exec import ExecManager
|
|
16
|
+
|
|
17
|
+
# 匯入檔案儲存對話框
|
|
18
|
+
# Import file save dialog
|
|
8
19
|
from je_editor.pyside_ui.dialog.file_dialog.save_file_dialog import choose_file_get_save_file_path
|
|
20
|
+
|
|
21
|
+
# 匯入編輯器元件
|
|
22
|
+
# Import EditorWidget
|
|
9
23
|
from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
|
|
24
|
+
|
|
25
|
+
# 匯入輸入處理 (用於程式輸入)
|
|
26
|
+
# Import ProcessInput for handling program input
|
|
10
27
|
from je_editor.pyside_ui.main_ui.editor.process_input import ProcessInput
|
|
28
|
+
|
|
29
|
+
# 匯入工具函式:顯示「請先關閉目前執行中的程式」訊息框
|
|
30
|
+
# Import utility: show message box if a program is already running
|
|
11
31
|
from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.utils import please_close_current_running_messagebox
|
|
32
|
+
|
|
33
|
+
# 匯入日誌紀錄器
|
|
34
|
+
# Import logger instance
|
|
12
35
|
from je_editor.utils.logging.loggin_instance import jeditor_logger
|
|
36
|
+
|
|
37
|
+
# 匯入多語言包裝器
|
|
38
|
+
# Import multi-language wrapper for UI localization
|
|
13
39
|
from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
|
|
14
40
|
|
|
41
|
+
# 僅在型別檢查時匯入 EditorMain,避免循環依賴
|
|
42
|
+
# Import EditorMain only for type checking (avoids circular dependency)
|
|
15
43
|
if TYPE_CHECKING:
|
|
16
44
|
from je_editor.pyside_ui.main_ui.main_editor import EditorMain
|
|
17
45
|
|
|
18
46
|
|
|
47
|
+
# 設定「執行程式」選單
|
|
48
|
+
# Set up the "Run Program" menu
|
|
19
49
|
def set_program_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
20
50
|
jeditor_logger.info(f"build_program_menu.py set_program_menu ui_we_want_to_set: {ui_we_want_to_set}")
|
|
51
|
+
# 在 Run 選單下建立 Program 子選單
|
|
52
|
+
# Create Program submenu under Run menu
|
|
21
53
|
ui_we_want_to_set.run_program_menu = ui_we_want_to_set.run_menu.addMenu(
|
|
22
54
|
language_wrapper.language_word_dict.get("run_menu_run_program_label"))
|
|
23
|
-
|
|
55
|
+
|
|
56
|
+
# 建立「執行程式」動作
|
|
57
|
+
# Add "Run Program" action
|
|
24
58
|
ui_we_want_to_set.run_program_menu.run_program_action = QAction(
|
|
25
59
|
language_wrapper.language_word_dict.get("run_menu_run_program_label"))
|
|
26
60
|
ui_we_want_to_set.run_program_menu.run_program_action.triggered.connect(
|
|
27
61
|
lambda: run_program(ui_we_want_to_set)
|
|
28
62
|
)
|
|
29
63
|
ui_we_want_to_set.run_program_menu.addAction(ui_we_want_to_set.run_program_menu.run_program_action)
|
|
30
|
-
|
|
64
|
+
|
|
65
|
+
# 建立「顯示程式輸入」動作
|
|
66
|
+
# Add "Show Program Input" action
|
|
31
67
|
ui_we_want_to_set.run_program_menu.show_shell_input = QAction(
|
|
32
68
|
language_wrapper.language_word_dict.get("show_program_input"))
|
|
33
69
|
ui_we_want_to_set.run_program_menu.show_shell_input.triggered.connect(
|
|
@@ -36,26 +72,36 @@ def set_program_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
|
36
72
|
ui_we_want_to_set.run_program_menu.addAction(ui_we_want_to_set.run_program_menu.show_shell_input)
|
|
37
73
|
|
|
38
74
|
|
|
75
|
+
# 執行程式
|
|
76
|
+
# Run program
|
|
39
77
|
def run_program(ui_we_want_to_set: EditorMain) -> None:
|
|
40
78
|
jeditor_logger.info(f"build_program_menu.py run_program ui_we_want_to_set: {ui_we_want_to_set}")
|
|
41
79
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
42
80
|
if isinstance(widget, EditorWidget):
|
|
81
|
+
# 確保沒有正在執行的程式
|
|
82
|
+
# Ensure no program is already running
|
|
43
83
|
if widget.exec_program is None:
|
|
44
84
|
widget.python_compiler = ui_we_want_to_set.python_compiler
|
|
85
|
+
# 要求使用者選擇儲存檔案路徑
|
|
86
|
+
# Ask user to choose save file path
|
|
45
87
|
if choose_file_get_save_file_path(ui_we_want_to_set):
|
|
88
|
+
# 建立程式執行管理器並執行程式
|
|
89
|
+
# Create ExecManager and run program
|
|
46
90
|
code_exec = ExecManager(widget, program_encoding=ui_we_want_to_set.encoding)
|
|
47
91
|
code_exec.later_init()
|
|
48
|
-
code_exec.exec_code(
|
|
49
|
-
widget.current_file
|
|
50
|
-
)
|
|
92
|
+
code_exec.exec_code(widget.current_file)
|
|
51
93
|
widget.exec_program = code_exec
|
|
52
94
|
else:
|
|
95
|
+
# 如果已有程式在執行,顯示提示訊息
|
|
96
|
+
# If a program is already running, show message
|
|
53
97
|
please_close_current_running_messagebox(ui_we_want_to_set)
|
|
54
98
|
|
|
55
99
|
|
|
100
|
+
# 顯示程式輸入介面
|
|
101
|
+
# Show program input interface
|
|
56
102
|
def show_program_input(ui_we_want_to_set: EditorMain) -> None:
|
|
57
103
|
jeditor_logger.info(f"build_program_menu.py show_program_input ui_we_want_to_set: {ui_we_want_to_set}")
|
|
58
104
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
59
105
|
if isinstance(widget, EditorWidget):
|
|
60
106
|
widget.program_input = ProcessInput(widget, "program")
|
|
61
|
-
widget.program_input.show()
|
|
107
|
+
widget.program_input.show()
|