/
Jackmas
/
video
Обзор
Документация
Войти
/
Jackmas
/
video
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
edit_json.py
201 строка
8 KB
jackmas
v2.1
02 фев 2026, 15:00
02 фев 2026, 15:00
ba99ac0
Код
Авторство
О чём код?
import sys import json from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class TableEditDialog(QDialog): def __init__(self, json_data, parent=None): super().__init__(parent) self.json_data = json_data self.setup_ui() self.load_data() def setup_ui(self): self.setWindowTitle("Табличное редактирование камер") self.setMinimumSize(800, 400) layout = QVBoxLayout() # Таблица для редактирования self.table = QTableWidget() self.table.setColumnCount(2) self.table.setHorizontalHeaderLabels(["Название камеры", "RTSP URL"]) self.table.horizontalHeader().setStretchLastSection(True) # Кнопки управления строками button_layout = QHBoxLayout() self.add_button = QPushButton("Добавить камеру") self.delete_button = QPushButton("Удалить выбранную") self.add_button.clicked.connect(self.add_row) self.delete_button.clicked.connect(self.delete_row) button_layout.addWidget(self.add_button) button_layout.addWidget(self.delete_button) button_layout.addStretch() # Кнопки диалога dialog_buttons = QHBoxLayout() self.save_button = QPushButton("Сохранить") self.cancel_button = QPushButton("Отмена") self.save_button.clicked.connect(self.accept) self.cancel_button.clicked.connect(self.reject) dialog_buttons.addStretch() dialog_buttons.addWidget(self.save_button) dialog_buttons.addWidget(self.cancel_button) layout.addWidget(QLabel("Редактирование камер:")) layout.addWidget(self.table) layout.addLayout(button_layout) layout.addLayout(dialog_buttons) self.setLayout(layout) def load_data(self): """Загружает данные в таблицу""" self.table.setRowCount(len(self.json_data)) for i, camera in enumerate(self.json_data): # Название камеры camera_item = QTableWidgetItem(camera.get("camera", f"Cam-{i+1}")) # RTSP ссылка rtsp_item = QTableWidgetItem(camera.get("rtsp", "")) self.table.setItem(i, 0, camera_item) self.table.setItem(i, 1, rtsp_item) def add_row(self): """Добавляет новую строку в таблицу""" row = self.table.rowCount() self.table.insertRow(row) self.table.setItem(row, 0, QTableWidgetItem(f"Cam-{row+1}")) self.table.setItem(row, 1, QTableWidgetItem("")) def delete_row(self): """Удаляет выбранную строку""" current_row = self.table.currentRow() if current_row >= 0: self.table.removeRow(current_row) def get_json_data(self): """Возвращает данные из таблицы в формате JSON""" data = [] for row in range(self.table.rowCount()): camera_name = self.table.item(row, 0) rtsp_url = self.table.item(row, 1) if camera_name and rtsp_url: data.append({ "camera": camera_name.text(), "rtsp": rtsp_url.text() }) return data class MainWindowSimplified(QMainWindow): def __init__(self): super().__init__() self.json_file = "cameras.json" self.cameras = self.load_initial_data() self.setup_ui() def load_initial_data(self): """Загружает начальные данные""" try: with open(self.json_file, 'r', encoding='utf-8') as f: return json.load(f) except: return [ {"camera": "Cam-1", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-2", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-3", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-4", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-5", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-6", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-7", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-8", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"}, {"camera": "Cam-9", "rtsp": "rtsp://admin:L2C64546@192.168.0.144:554/cam/realmonitor?channel=1&subtype=00"} ] def setup_ui(self): self.setWindowTitle("Управление камерами RTSP") self.setGeometry(100, 100, 800, 600) # Меню menubar = self.menuBar() edit_menu = menubar.addMenu("Редактирование") self.action_edit = QAction("Редактировать камеры", self) self.action_edit.triggered.connect(self.edit_cameras) self.action_edit.setShortcut("Ctrl+E") self.action_save = QAction("Сохранить изменения", self) self.action_save.triggered.connect(self.save_changes) self.action_save.setShortcut("Ctrl+S") edit_menu.addAction(self.action_edit) edit_menu.addAction(self.action_save) # Центральный виджет central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout() # Список камер в виде текста self.text_browser = QTextBrowser() self.text_browser.setFont(QFont("Courier", 10)) layout.addWidget(QLabel("Текущая конфигурация камер:")) layout.addWidget(self.text_browser) # Кнопки button_layout = QHBoxLayout() self.edit_button = QPushButton("Редактировать") self.refresh_button = QPushButton("Обновить") self.edit_button.clicked.connect(self.edit_cameras) self.refresh_button.clicked.connect(self.display_cameras) button_layout.addWidget(self.edit_button) button_layout.addWidget(self.refresh_button) button_layout.addStretch() layout.addLayout(button_layout) central_widget.setLayout(layout) # Отображаем данные self.display_cameras() def display_cameras(self): """Отображает камеры в текстовом поле""" formatted = json.dumps(self.cameras, indent=2, ensure_ascii=False) self.text_browser.setPlainText(formatted) def edit_cameras(self): """Открывает диалог редактирования""" dialog = TableEditDialog(self.cameras, self) if dialog.exec_(): self.cameras = dialog.get_json_data() self.display_cameras() self.save_changes() def save_changes(self): """Сохраняет изменения в файл""" try: with open(self.json_file, 'w', encoding='utf-8') as f: json.dump(self.cameras, f, indent=2, ensure_ascii=False) QMessageBox.information(self, "Успех", "Конфигурация камер сохранена") except Exception as e: QMessageBox.critical(self, "Ошибка", f"Ошибка сохранения: {str(e)}") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindowSimplified() window.show() sys.exit(app.exec_())