# Импортировать модуль json для работы с данными в формате JSON
import json
# Определить классы для представления объектов из файлов
class AnubisConfig:
def __init__(self, AnubisConfigName, GUID, AnubisConfigType, AnubisConfigData):
self.AnubisConfigName = AnubisConfigName
self.GUID = GUID
self.AnubisConfigType = AnubisConfigType
self.AnubisConfigData = AnubisConfigData
# Написать функцию для чтения файла и преобразования его содержимого в список объектов класса AnubisConfig
def read_file(filename):
with open(filename, "r") as f:
data = json.load(f) # Преобразовать JSON-строку в словарь Python
objects = [] # Создать пустой список для хранения объектов
for item in data: # Перебрать словарь по ключам
# Создать объект класса AnubisConfig с помощью конструктора и добавить его в список
objects.append(AnubisConfig(item, data[item]["GUID"], data[item]["AnubisConfigType"], data[item]["AnubisConfigData"]))
return objects # Вернуть список объектов
# Написать функцию для записи списка объектов класса AnubisConfig в файл в формате JSON
def write_file(objects, filename):
with open(filename, "w") as f:
data = {} # Создать пустой словарь для хранения данных
for obj in objects: # Перебрать список объектов
# Преобразовать объект в словарь и добавить его в общий словарь по ключу AnubisConfigName
data[obj.AnubisConfigName] = {"GUID": obj.GUID, "AnubisConfigType": obj.AnubisConfigType, "AnubisConfigData": obj.AnubisConfigData}
json.dump(data, f) # Преобразовать словарь в JSON-строку и записать ее в файл
# Импортировать модуль wxPython для создания графического интерфейса на Python
import wx
# Создать главное окно приложения с помощью класса wx.Frame
app = wx.App() # Создать объект приложения
frame = wx.Frame(None, title="Anubis Config Editor", size=(800, 600)) # Создать объект окна с заголовком и размером
# Добавить элементы управления в окно
panel = wx.Panel(frame) # Создать панель для размещения элементов управления
open_button = wx.Button(panel, label="Open") # Создать кнопку для открытия файла
create_button = wx.Button(panel, label="Create") # Создать кнопку для создания нового объекта
export_button = wx.Button(panel, label="Export") # Создать кнопку для экспорта списка объектов в файл
object_list = wx.ListBox(panel) # Создать список для отображения объектов из файла
object_name = wx.TextCtrl(panel) # Создать текстовое поле для отображения или изменения имени объекта
object_guid = wx.TextCtrl(panel) # Создать текстовое поле для отображения или изменения GUID объекта
object_type = wx.TextCtrl(panel) # Создать текстовое поле для отображения или изменения типа объекта
object_data = wx.TextCtrl(panel, style=wx.TE_MULTILINE) # Создать текстовое поле для отображения или изменения данных объекта
# Расположить элементы управления на панели с помощью сетки из 4 строк и 2 столбцов
sizer = wx.GridBagSizer(4, 2) # Создать объект сетки с заданным количеством строк и столбцов
sizer.Add(open_button, (0, 0), flag=wx.EXPAND) # Добавить кнопку открытия в ячейку (0, 0) и растянуть ее по горизонтали
sizer.Add(create_button, (0, 1), flag=wx.EXPAND) # Добавить кнопку создания в ячейку (0, 1) и растянуть ее по горизонтали
sizer.Add(export_button, (1, 0), flag=wx.EXPAND) # Добавить кнопку экспорта в ячейку (1, 0) и растянуть ее по горизонтали
sizer.Add(object_list, (1, 1), (3, 1), flag=wx.EXPAND) # Добавить список объектов в ячейку (1, 1) и растянуть ее по вертикали и горизонтали
sizer.Add(object_name, (2, 0), flag=wx.EXPAND) # Добавить текстовое поле имени в ячейку (2, 0) и растянуть ее по горизонтали
sizer.Add(object_guid, (3, 0), flag=wx.EXPAND) # Добавить текстовое поле GUID в ячейку (3, 0) и растянуть ее по горизонтали
sizer.Add(object_type, (4, 0), flag=wx.EXPAND) # Добавить текстовое поле типа в ячейку (4, 0) и растянуть ее по горизонтали
sizer.Add(object_data, (5, 0), (1, 2), flag=wx.EXPAND) # Добавить текстовое поле данных в ячейку (5, 0) и растянуть ее по вертикали и горизонтали
panel.SetSizer(sizer) # Установить сетку как менеджер размещения для панели
# Привязать события к элементам управления
open_button.Bind(wx.EVT_BUTTON, lambda event: open_file(event)) # Привязать событие нажатия кнопки открытия к функции open_file
create_button.Bind(wx.EVT_BUTTON, lambda event: create_object(event)) # Привязать событие нажатия кнопки создания к функции create_object
export_button.Bind(wx.EVT_BUTTON, lambda event: export_file(event)) # Привязать событие нажатия кнопки экспорта к функции export_file
object_list.Bind(wx.EVT_LISTBOX, lambda event: show_object(event)) # Привязать событие выбора элемента из списка к функции show_object
# Написать логику приложения
# Создать пустой список для хранения объектов из файла
objects = []
# Определить функцию для открытия файла и заполнения списка объектов
def open_file(event):
global objects # Объявить переменную objects как глобальную
file_dialog = wx.FileDialog(frame, "Choose a file", "", "", "JSON files (*.json)|*.json", wx.FD_OPEN) # Создать диалог выбора файла с фильтром по расширению .json
if file_dialog.ShowModal() == wx.ID_OK: # Если пользователь выбрал файл и нажал OK
filename = file_dialog.GetPath() # Получить путь к выбранному файлу
objects = read_file(filename) # Вызвать функцию чтения файла и присвоить результат переменной objects
object_list.Clear() # Очистить список объектов на интерфейсе
for obj in objects: # Перебрать список объектов
object_list.Append(obj.AnubisConfigName) # Добавить имя каждого объекта в список на интерфейсе
# Определить функцию для создания нового объекта с автоматически сгенерированным GUID и заданными значениями полей
def create_object(event):
global objects # Объявить переменную objects как глобальную
name = object_name.GetValue() # Получить значение из текстового поля имени
guid = wx.NewId() # Сгенерировать новый GUID с помощью метода wx.NewId()
type = object_type.GetValue() # Получить значение из текстового поля типа
data = object_data.GetValue() # Получить значение из текстового поля данных
new_object = AnubisConfig(name,