diff --git a/ComConfigCopy.py b/ComConfigCopy.py index 3c50979..b7885d8 100644 --- a/ComConfigCopy.py +++ b/ComConfigCopy.py @@ -700,6 +700,12 @@ class SerialAppGUI(tk.Tk): self.create_menu() self.create_tabs() + # Добавляем статус бар + self.create_status_bar() + + # Обновляем информацию в статус баре + self.update_status_bar() + # Проверка первого запуска self.check_first_run() @@ -763,6 +769,7 @@ class SerialAppGUI(tk.Tk): # Обработчик изменения настроек def on_settings_changed(self): self.settings = settings_load() + self.update_status_bar() # Добавляем обновление статус бара # Открытие окна настроек def open_settings(self): @@ -849,6 +856,7 @@ class SerialAppGUI(tk.Tk): self.connection = create_connection(self.settings) if self.connection: self.append_interactive_text("[INFO] Подключение установлено.\n") + self.update_status_bar() # Обновляем статус бар else: self.append_interactive_text("[ERROR] Не удалось установить соединение.\n") @@ -861,6 +869,7 @@ class SerialAppGUI(tk.Tk): pass self.connection = None self.append_interactive_text("[INFO] Соединение закрыто.\n") + self.update_status_bar() # Обновляем статус бар else: messagebox.showinfo("Информация", "Соединение не установлено.") @@ -1264,6 +1273,95 @@ class SerialAppGUI(tk.Tk): if not self.tftp_ip_var.get() in adapters: self.tftp_ip_var.set(adapters[0]) + # Добавляем новый метод для создания статус бара + def create_status_bar(self): + self.status_bar = ttk.Frame(self) + self.status_bar.pack(side=tk.BOTTOM, fill=tk.X) + + # Создаем индикатор состояния используя символ + self.connection_indicator = ttk.Label( + self.status_bar, + text="⬤", # Используем символ ЧЕРНЫЙ КРУГ (U+2B24) + font=("Segoe UI", 10), # Уменьшаем размер для лучшего выравнивания + width=2, # Фиксированная ширина для стабильного положения + anchor='center', # Центрируем символ + padding=(5, 2) # Добавляем вертикальный отступ для выравнивания с текстом + ) + self.connection_indicator.pack(side=tk.LEFT) + + # Создаем всплывающую подсказку + self.tooltip = None + self.connection_indicator.bind('', self.show_connection_tooltip) + self.connection_indicator.bind('', self.hide_connection_tooltip) + + ttk.Separator(self.status_bar, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=5) + + # Остальные элементы статус бара... + self.port_label = ttk.Label(self.status_bar, text="", padding=(5, 2)) + self.port_label.pack(side=tk.LEFT) + + ttk.Separator(self.status_bar, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=5) + + self.baudrate_label = ttk.Label(self.status_bar, text="", padding=(5, 2)) + self.baudrate_label.pack(side=tk.LEFT) + + ttk.Separator(self.status_bar, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=5) + + self.copy_mode_label = ttk.Label(self.status_bar, text="", padding=(5, 2)) + self.copy_mode_label.pack(side=tk.LEFT) + + ttk.Separator(self.status_bar, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=5) + + self.version_label = ttk.Label(self.status_bar, text=f"Версия: {VERSION}", padding=(5, 2)) + self.version_label.pack(side=tk.RIGHT) + + # Добавляем методы для управления всплывающей подсказкой + def show_connection_tooltip(self, event): + x, y, _, _ = self.connection_indicator.bbox("insert") + x += self.connection_indicator.winfo_rootx() + 25 + y += self.connection_indicator.winfo_rooty() + 20 + + # Удаляем предыдущий tooltip если есть + self.hide_connection_tooltip(event) + + self.tooltip = tk.Toplevel(self) + self.tooltip.wm_overrideredirect(True) + self.tooltip.wm_geometry(f"+{x}+{y}") + + label = ttk.Label( + self.tooltip, + text="Состояние подключения: " + + ("Подключено" if self.connection else "Отключено"), + justify=tk.LEFT, + background="#ffffe0", + relief=tk.SOLID, + borderwidth=1, + padding=(5, 2) + ) + label.pack() + + def hide_connection_tooltip(self, event): + if self.tooltip: + self.tooltip.destroy() + self.tooltip = None + + # Обновляем метод update_status_bar + def update_status_bar(self): + # Обновляем индикатор подключения + if self.connection: + self.connection_indicator.configure(text="⬤", foreground='green') + else: + self.connection_indicator.configure(text="⬤", foreground='red') + + # Остальные обновления статус бара + port = self.settings.get("port", "Не выбран") + baudrate = self.settings.get("baudrate", "9600") + copy_mode = "Построчный" if self.settings.get("copy_mode") == "line" else "Блочный" + + self.port_label.config(text=f"Порт: {port}") + self.baudrate_label.config(text=f"Скорость: {baudrate}") + self.copy_mode_label.config(text=f"Режим: {copy_mode}") + # ========================== # Основной запуск приложения # ==========================