Пишем конвертер YAML в JSON c графическим интерфейсом на Python

Пишем конвертер YAML в JSON c графическим интерфейсом на Python

В данной статье мы создадим приложение с графическим интерфейсом на PySide6, которое будет преобразовывать текст в формате YAML в JSON формат.

YAML — это распространенный формат хранения данных, подобный JSON. Этот формат, например, является одним из 3-ех базовых форматов хранения конфигурации в PHP фреймворке Symfony.

Вот простой пример формата YAML:


# комментарии
app_base_config:
    # строка
    base_name: YAML Test App
    config_dir: ./config
    # число
    max_connections: 10
    # список
    example_list:
        - one
        - two
        - three

Для разработки приложения создадим виртуальное окружение с помощью модуля Python venv в папке app и затем активируем его:

# это вариант для операционных систем на базе Linux, для Windows команды будут немного отличаться
$ python3 -m venv ./app
$ source bin/activate

В результате выполнения приведенных выше команд мы войдем в виртуальное окружение, где уже сможем ставить все необходимы нам библиотеки в рамках только данного проекта. Это удобно так, мы не «загрязняем» основную систему.

Теперь установим необходимые Python библиотеки:


pip install pyside6 pyyaml

А теперь напишем сам код приложения (файл yaml2json_gui.py):


#!/usr/bin/python

# импортируем необходимые пакеты
import sys
import yaml
import json

from PySide6 import QtCore
from PySide6.QtCore import Qt
from PySide6.QtGui import QCursor
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QTextEdit

# главное окно приложения
class MainWidget(QWidget):

    def __init__(self):
        super(MainWidget, self).__init__()
        self.createBaseUI()

    """
    В данном методе создается весь графический интерфейс приложения 
    """
    def createBaseUI(self):

        # два больших текстовых поля
        self.sourceTextEdit = QTextEdit()
        self.destanationTextEdit = QTextEdit()

        # расположим по горизонтали рядом друг с другом
        self.editBox = QHBoxLayout()
        self.editBox.addWidget(self.sourceTextEdit)
        self.editBox.addWidget(self.destanationTextEdit)

        # создадим необходимые кнопки, добавим им стили и обработчики нажатия
        self.convertButton = QPushButton("Конвертировать")
        self.convertButton.setStyleSheet("padding: 3px 5px")
        self.convertButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.convertButton.clicked.connect(self.onConvertButtonClicked)

        self.cancelButton = QPushButton("Очистить")
        self.cancelButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.cancelButton.clicked.connect(self.onClearButtonClicked)

        # кнопки расположим рядом друг с другом 
        self.hbox = QHBoxLayout()
        # в правой стороне
        self.hbox.addStretch(1)
        self.hbox.addWidget(self.convertButton)
        self.hbox.addWidget(self.cancelButton)

        # размещаем все виджеты по вертикали - один над другим
        # при этом они сами займут необходимое им место окна приложения
        self.vbox = QVBoxLayout()
        self.vbox.addLayout(self.editBox)
        self.vbox.addLayout(self.hbox)

        # устанавливаем непосредственно макет приложения
        self.setLayout(self.vbox)    

        # определяем положение и размеры, а также заголовок окна  
        self.setGeometry(300, 300, 800, 550)
        self.setWindowTitle('Yaml2Json Конвертер')    
        self.show()

    # метод, который расположит окно приложения по центру экрана
    def center(self):
        qrect = self.frameGeometry()
        qpoint = self.screen().availableGeometry().center()

        qrect.moveCenter(qpoint)
        self.move(qrect.topLeft())

    # обработчик, срабатывающий при конвертировании YAML в JSON
    @QtCore.Slot()
    def onConvertButtonClicked(self):
        convertedText = yaml2json(self.sourceTextEdit.toPlainText())
        self.destanationTextEdit.setText(convertedText)

    # обработчик кнопки очистки полей ввода
    @QtCore.Slot()
    def onClearButtonClicked(self):
        self.sourceTextEdit.setText("")
        self.destanationTextEdit.setText("")

# преобразуем yaml в json, расставляя отступы 
def yaml2json(yamltext):
    yamlobj = yaml.load(yamltext, Loader=yaml.FullLoader)
    return json.dumps(yamlobj, indent=4, sort_keys=False)

# точка входа в приложения
def main():

    app = QApplication(sys.argv)
    mainWidget = MainWidget()
    mainWidget.center()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

Запускаем приложения:


$ python ./yaml2json_gui.py

Таким образом, в данной статье мы сделали конвертер yaml в json с графическим интерфейсом на PySide6.

Источник

Статьи по теме

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Проверьте также
Close
Back to top button