Пишем конвертер 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