Формирование пользовательского приложения
В данном разделе рассмотрим создание простейшего приложения, которое можно запускать из оболочки 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_()
После запуска окно будет выглядеть примерно так:
Далее, нам необходимо добавить пользовательское действие и, как реакция на него, будет открытие и отображение файла в окне карты. Одновременно с этим создается окно управления слоями.
Результирующий код будет выглядеть следующим образом:
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_()
Результат работы: