Формирование пользовательского приложения

В данном разделе рассмотрим создание простейшего приложения, которое можно запускать из оболочки python. При этом пользовательский интерфейс будет строится исходя из предпочтений пользователя. В рамках примера создадим приложение, которое будет открывать файл и показывать его в окне карты. Также вставим стандартное окно управления слоями карты axipy.LayerControlWidget.

Первым шагом проинициализируем ядро (подробнее см. Инициализация) и определим главное окно нашего будущего приложения. Код будет выглядеть следующим образом:

from PySide2.QtWidgets import QMainWindow
from axipy import init_axioma


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Пример окна приложения")


# Инициализация ядра
app = init_axioma()

# Создание и отображение главного окна
main_window = MainWindow()
main_window.resize(1200, 800)
main_window.show()

# Запуск основного цикла программы
app.exec_()

После того как мы создали пустое окно добавим панель инструментов со стандартными действиями (полный список действий можно посмотреть axipy.ActionManager.items()). Код будет выглядеть следующим образом:

from PySide2.QtWidgets import QMainWindow
from axipy import init_axioma, ActionManager


class MainWindow(QMainWindow):

    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle("Пример окна приложения")
        self._add_buttons()

    def _add_buttons(self) -> None:
        def _add_action(name) -> None:
            # Добавляем системное действие
            act = ActionManager.get(name)
            if act:
                self.toolbar.addAction(act)

        # Создаем панель инструментов
        self.toolbar = self.addToolBar("Панель")
        # Добавляем стандартные кнопки
        _add_action("SaveTables")
        _add_action("Select")
        _add_action("Pan")
        _add_action("ZoomIn")
        _add_action("ZoomOut")
        _add_action("PointDraw")


# Инициализация ядра
app = init_axioma()

# Создание и отображение главного окна
main_window = MainWindow()
main_window.resize(1200, 800)
main_window.show()

# Запуск основного цикла программы
app.exec_()

После запуска окно будет выглядеть примерно так:

_images/main_window_empty.png

Далее, нам необходимо добавить пользовательское действие и, как реакция на него, будет открытие и отображение файла в окне карты. Одновременно с этим создается окно управления слоями.

Результирующий код будет выглядеть следующим образом:

from PySide2.QtCore import Qt
from PySide2.QtWidgets import QMainWindow, QFileDialog, QDockWidget, QAction
from axipy import (
    init_axioma, provider_manager, Layer, view_manager, Map, LayerControlWidget, ActionManager
)


class MainWindow(QMainWindow):

    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle("Пример окна приложения")
        self._add_buttons()

    # Открытие файла
    def __open_file(self) -> None:
        file_name, _ = QFileDialog.getOpenFileName(self, "Открыть", filter="MapInfo TAB (*.tab)")
        if file_name:
            table = provider_manager.openfile(file_name)
            # создаем слой
            layer = Layer.create(table)
            # если карты нет, то создаем ее
            if not view_manager.active:
                map_ = Map([layer])
                mapview = view_manager.create_mapview(map_)
                self._create_layer_control_dock()
                view_manager.activate(mapview)
                self.setCentralWidget(mapview.widget)
            # если есть, добавляем слой в окно карты
            else:
                view_manager.active.map.layers.append(layer)

    # Добавление по левой стороне окно управления слоями карты
    def _create_layer_control_dock(self) -> None:
        self._layer_control_w = LayerControlWidget()
        dock_layer_control = QDockWidget(self._layer_control_w.widget.windowTitle(), self)
        dock_layer_control.setWidget(self._layer_control_w.widget)
        self.addDockWidget(Qt.LeftDockWidgetArea, dock_layer_control)

    # Добавление кнопок на панель инструментов
    def _add_buttons(self) -> None:
        # Создаем панель инструментов
        self.toolbar = self.addToolBar("Панель")

        # Пользовательское действие открытия файла
        self.action_open = QAction(ActionManager.icon_by_name("open"), "Открыть файл")
        self.action_open.triggered.connect(self.__open_file)
        self.toolbar.addAction(self.action_open)

        def _add_action(name) -> None:
            # Добавляем системное действие
            act = ActionManager.get(name)
            if act:
                self.toolbar.addAction(act)

        _add_action("SaveTables")
        _add_action("Select")
        _add_action("Pan")
        _add_action("ZoomIn")
        _add_action("ZoomOut")
        _add_action("PointDraw")


# Инициализация ядра
app = init_axioma()

# Создание и отображение главного окна
main_window = MainWindow()
main_window.resize(1200, 800)
main_window.show()

# Запуск основного цикла программы
app.exec_()

Результат работы:

_images/main_window.png