Improve first-run detection and settings initialization

- Enhance `settings_load()` function to handle missing settings and parameters
- Improve first-run detection in `check_first_run()` method
- Add more robust settings file validation
- Remove unused imports
- Simplify and clean up code comments
This commit is contained in:
2025-02-16 02:04:04 +03:00
parent f089edba8b
commit 625b6d5558

View File

@@ -1,23 +1,19 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Это программа для копирования конфигураций на коммутаторы # Это программа для копирования конфигураций на коммутаторы
# Программа использует библиотеку PySerial для работы с последовательными портами # ------------------------------------------------------------
# Программа использует библиотеку PyQt5 для создания графического интерфейса
# Программа использует библиотеку PyQt5.QtWidgets для создания графического интерфейса
# Программа использует библиотеку PyQt5.QtCore для создания графического интерфейса
# Программа использует библиотеку PyQt5.QtGui для создания графического интерфейса
# import argparse Использовался для получения аргументов из командной строки (не используется)
# import argparse Использовался для получения аргументов из командной строки # import platform Использовался для получения списка сетевых адаптеров (не используется)
# import platform Использовался для получения списка сетевых адаптеров # import subprocess Использовался для получения списка сетевых адаптеров (не используется)
# import subprocess Использовался для получения списка сетевых адаптеров # import socket не используется
import json import json
import logging import logging
import os import os
import re import re
import socket
import sys import sys
import threading import threading
import time import time
@@ -25,8 +21,6 @@ from getpass import getpass
from logging.handlers import RotatingFileHandler from logging.handlers import RotatingFileHandler
import tkinter as tk import tkinter as tk
from tkinter import ( from tkinter import (
Tk,
Frame,
StringVar, StringVar,
END, END,
BOTH, BOTH,
@@ -82,21 +76,42 @@ def settings_load():
"block_size": 15, # Размер блока команд "block_size": 15, # Размер блока команд
"prompt": ">", # Используется для определения приглашения "prompt": ">", # Используется для определения приглашения
} }
# Создаем папку Settings, если её нет
os.makedirs("Settings", exist_ok=True)
if not os.path.exists(SETTINGS_FILE): if not os.path.exists(SETTINGS_FILE):
try: try:
# При первом запуске создаем новый файл настроек
with open(SETTINGS_FILE, "w", encoding="utf-8") as f: with open(SETTINGS_FILE, "w", encoding="utf-8") as f:
json.dump(default_settings, f, indent=4, ensure_ascii=False) json.dump(default_settings, f, indent=4, ensure_ascii=False)
logging.info("Файл настроек создан с настройками по умолчанию.") logging.info("Файл настроек создан с настройками по умолчанию.")
return default_settings
except Exception as e: except Exception as e:
logging.error(f"Ошибка при создании файла настроек: {e}", exc_info=True) logging.error(f"Ошибка при создании файла настроек: {e}", exc_info=True)
return default_settings return default_settings
try: try:
# Пытаемся загрузить существующие настройки
with open(SETTINGS_FILE, "r", encoding="utf-8") as f: with open(SETTINGS_FILE, "r", encoding="utf-8") as f:
settings = json.load(f) settings = json.load(f)
# Проверяем наличие всех необходимых параметров
settings_changed = False
for key, value in default_settings.items(): for key, value in default_settings.items():
if key not in settings: if key not in settings:
settings[key] = value settings[key] = value
settings_changed = True
# Если были добавлены новые параметры, сохраняем обновленные настройки
if settings_changed:
try:
with open(SETTINGS_FILE, "w", encoding="utf-8") as f:
json.dump(settings, f, indent=4, ensure_ascii=False)
logging.info("Файл настроек обновлен с новыми параметрами.")
except Exception as e:
logging.error(f"Ошибка при обновлении файла настроек: {e}", exc_info=True)
return settings return settings
except Exception as e: except Exception as e:
logging.error(f"Ошибка загрузки файла настроек: {e}", exc_info=True) logging.error(f"Ошибка загрузки файла настроек: {e}", exc_info=True)
@@ -535,8 +550,25 @@ class SerialAppGUI(tk.Tk):
self.check_first_run() self.check_first_run()
def check_first_run(self): def check_first_run(self):
# Проверяем, существует ли папка Settings и файл settings.json """Проверка первого запуска программы"""
if not os.path.exists("Settings") or not os.path.exists(SETTINGS_FILE): show_settings = False
# Проверяем существование файла настроек
if not os.path.exists(SETTINGS_FILE):
show_settings = True
else:
# Проверяем содержимое файла настроек
try:
with open(SETTINGS_FILE, "r", encoding="utf-8") as f:
settings = json.load(f)
# Если порт не настроен, считаем это первым запуском
if settings.get("port") is None:
show_settings = True
except Exception:
# Если файл поврежден или не читается, тоже показываем настройки
show_settings = True
if show_settings:
# Создаем папку Settings, если её нет # Создаем папку Settings, если её нет
os.makedirs("Settings", exist_ok=True) os.makedirs("Settings", exist_ok=True)