Add advanced file execution control with pause and stop functionality
- Implement multi-stage command execution from file - Add start, pause, and stop buttons for file command execution - Create thread-safe execution control with pause and stop mechanisms - Enhance error handling and user feedback during file command execution - Improve command execution flow with step-by-step processing
This commit is contained in:
115
ComConfigCopy.py
115
ComConfigCopy.py
@@ -760,6 +760,11 @@ class SerialAppGUI(tk.Tk):
|
|||||||
# Добавляем VERSION как атрибут класса
|
# Добавляем VERSION как атрибут класса
|
||||||
self.VERSION = VERSION
|
self.VERSION = VERSION
|
||||||
|
|
||||||
|
# Добавляем атрибуты для управления выполнением файла
|
||||||
|
self.execution_thread = None
|
||||||
|
self.execution_paused = False
|
||||||
|
self.execution_stop = False
|
||||||
|
|
||||||
# Инициализация проверки обновлений
|
# Инициализация проверки обновлений
|
||||||
self.update_checker = UpdateChecker(
|
self.update_checker = UpdateChecker(
|
||||||
VERSION,
|
VERSION,
|
||||||
@@ -1029,7 +1034,20 @@ class SerialAppGUI(tk.Tk):
|
|||||||
self.file_exec_var = StringVar(value=self.settings.get("config_file") or "")
|
self.file_exec_var = StringVar(value=self.settings.get("config_file") or "")
|
||||||
CustomEntry(file_frame, textvariable=self.file_exec_var, width=40).pack(side=LEFT, padx=5)
|
CustomEntry(file_frame, textvariable=self.file_exec_var, width=40).pack(side=LEFT, padx=5)
|
||||||
ttk.Button(file_frame, text="Выбрать", command=self.select_config_file_fileexec).pack(side=LEFT, padx=5)
|
ttk.Button(file_frame, text="Выбрать", command=self.select_config_file_fileexec).pack(side=LEFT, padx=5)
|
||||||
ttk.Button(frame, text="Выполнить команды", command=self.execute_file_commands).pack(pady=5)
|
|
||||||
|
# Создаем фрейм для кнопок управления
|
||||||
|
control_frame = ttk.Frame(frame)
|
||||||
|
control_frame.pack(pady=5)
|
||||||
|
|
||||||
|
# Кнопки управления выполнением
|
||||||
|
self.start_button = ttk.Button(control_frame, text="▶ Старт", command=self.start_execution)
|
||||||
|
self.start_button.pack(side=LEFT, padx=5)
|
||||||
|
|
||||||
|
self.pause_button = ttk.Button(control_frame, text="⏸ Пауза", command=self.pause_execution, state="disabled")
|
||||||
|
self.pause_button.pack(side=LEFT, padx=5)
|
||||||
|
|
||||||
|
self.stop_button = ttk.Button(control_frame, text="⏹ Остановить", command=self.stop_execution, state="disabled")
|
||||||
|
self.stop_button.pack(side=LEFT, padx=5)
|
||||||
|
|
||||||
# Используем новый TerminalWidget вместо CustomText
|
# Используем новый TerminalWidget вместо CustomText
|
||||||
self.file_exec_text = TerminalWidget(frame, height=15)
|
self.file_exec_text = TerminalWidget(frame, height=15)
|
||||||
@@ -1064,21 +1082,86 @@ class SerialAppGUI(tk.Tk):
|
|||||||
if not self.connection:
|
if not self.connection:
|
||||||
self.append_file_exec_text("[ERROR] Не удалось установить соединение.\n")
|
self.append_file_exec_text("[ERROR] Не удалось установить соединение.\n")
|
||||||
return
|
return
|
||||||
threading.Thread(
|
|
||||||
target=execute_commands_from_file,
|
try:
|
||||||
args=(
|
with open(self.file_exec_var.get(), "r", encoding="utf-8") as file:
|
||||||
self.connection,
|
self.commands = [line.strip() for line in file if line.strip()]
|
||||||
self.file_exec_var.get(),
|
|
||||||
self.settings.get("timeout", 10),
|
self.current_command_index = 0
|
||||||
self.settings.get("copy_mode", "line"),
|
self.execution_paused = False
|
||||||
self.settings.get("block_size", 15),
|
self.execution_stop = False
|
||||||
self.append_file_exec_text,
|
|
||||||
self.settings.get("login"),
|
# Запускаем выполнение команд
|
||||||
self.settings.get("password"),
|
self.execute_next_command()
|
||||||
True,
|
|
||||||
),
|
except Exception as e:
|
||||||
daemon=True,
|
self.append_file_exec_text(f"[ERROR] Ошибка при чтении файла: {str(e)}\n")
|
||||||
).start()
|
self.reset_execution_buttons()
|
||||||
|
|
||||||
|
def execute_next_command(self):
|
||||||
|
if self.execution_stop:
|
||||||
|
self.reset_execution_buttons()
|
||||||
|
self.append_file_exec_text("[INFO] Выполнение остановлено.\n")
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.execution_paused:
|
||||||
|
self.after(1000, self.execute_next_command)
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.current_command_index < len(self.commands):
|
||||||
|
cmd = self.commands[self.current_command_index]
|
||||||
|
try:
|
||||||
|
success, response = send_command_and_process_response(
|
||||||
|
self.connection,
|
||||||
|
cmd,
|
||||||
|
self.settings.get("timeout", 10),
|
||||||
|
max_attempts=3,
|
||||||
|
log_callback=self.append_file_exec_text,
|
||||||
|
login=self.settings.get("login"),
|
||||||
|
password=self.settings.get("password"),
|
||||||
|
is_gui=True
|
||||||
|
)
|
||||||
|
|
||||||
|
self.current_command_index += 1
|
||||||
|
# Планируем выполнение следующей команды
|
||||||
|
self.after(1000, self.execute_next_command)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.append_file_exec_text(f"[ERROR] Ошибка при выполнении команды: {str(e)}\n")
|
||||||
|
self.reset_execution_buttons()
|
||||||
|
else:
|
||||||
|
self.append_file_exec_text("[INFO] Выполнение завершено.\n")
|
||||||
|
self.reset_execution_buttons()
|
||||||
|
|
||||||
|
def start_execution(self):
|
||||||
|
if not self.execution_thread or not self.execution_thread.is_alive():
|
||||||
|
self.start_button.config(state="disabled")
|
||||||
|
self.pause_button.config(state="normal")
|
||||||
|
self.stop_button.config(state="normal")
|
||||||
|
self.execution_thread = threading.Thread(target=self.execute_file_commands, daemon=True)
|
||||||
|
self.execution_thread.start()
|
||||||
|
|
||||||
|
def pause_execution(self):
|
||||||
|
if not self.execution_paused:
|
||||||
|
self.execution_paused = True
|
||||||
|
self.pause_button.config(text="▶ Продолжить")
|
||||||
|
self.append_file_exec_text("[INFO] Выполнение приостановлено.\n")
|
||||||
|
else:
|
||||||
|
self.execution_paused = False
|
||||||
|
self.pause_button.config(text="⏸ Пауза")
|
||||||
|
self.append_file_exec_text("[INFO] Выполнение возобновлено.\n")
|
||||||
|
|
||||||
|
def stop_execution(self):
|
||||||
|
self.execution_stop = True
|
||||||
|
self.execution_paused = False
|
||||||
|
self.append_file_exec_text("[INFO] Остановка выполнения...\n")
|
||||||
|
|
||||||
|
def reset_execution_buttons(self):
|
||||||
|
self.start_button.config(state="normal")
|
||||||
|
self.pause_button.config(state="disabled", text="⏸ Пауза")
|
||||||
|
self.stop_button.config(state="disabled")
|
||||||
|
self.execution_paused = False
|
||||||
|
self.execution_stop = False
|
||||||
|
|
||||||
# Создание вкладки "Редактор конфигурационного файла"
|
# Создание вкладки "Редактор конфигурационного файла"
|
||||||
def create_config_editor_tab(self, frame):
|
def create_config_editor_tab(self, frame):
|
||||||
|
|||||||
Reference in New Issue
Block a user