ConcurrentGuiUtils - Показать прогресс длительной операции

showLongWait(spec, fn, *args, **kwargs)

Запускает пользовательскую функцию в отдельном потоке и поднимает диалог отображающий прогресс. Тип диалога зависит от флага из перечисления ProgressSpec(). В пользовательскую функцию будет передан PythonProgressHandler как первый аргумент функции

Параметры
  • spec (ProgressSpec) – Данные для инициализации диалога отображающего прогресс

  • fn (function) – Пользовательская функция

  • args (tuple) – Набор аргументов которые будут переданы в пользовательскую функцию при вызове

  • kwargs (dict) – Словарь который будет передан в пользовательскую функцию при вызове

Пример использования:

Без управления прогрессом можно запустить вычисления следующим образом:


import axioma
import axioma.core.geometry as gm
from axioma.core import open_json
from axioma.gui import ProgressSpec, showLongWait

def user_heavy_function(json):
    """
    Пример пользовательской функции выполняющей длительные вычисления
    """
    table = open_json(json)
    features = table.allFeatures()
    index_geo = table.tableSchema().geometryIndex()
    result = []
    for feature in features: 
        geom = feature.getAttribute(index_geo)
        if not gm.isValid(geom):
            geom = gm.normalizedGeometry(geom)
        result.append(gm.ConvexHull(geom))
    return result
    

json = {"src": "path/to/tab_file_name.TAB"}
spec = ProgressSpec("Получаем минимальный окаймляющий полигон", axioma.app.mainWindow)
result = showLongWait(spec, user_heavy_function, json)
print(result)

При необходимости управлять прогрессом операции или обрабатывать отмену вычислений нужно использовать PythonProgressHandler который всегда передаётся в пользовательскую фукнцию как первый аргумент


import axioma
from axioma.core import open_json
import axioma.core.geometry as gm
from axioma.gui import ProgressSpec, showLongWait


def user_heavy_function(progressHandler, json):
    """
    Пример пользовательской функции выполняющей длительные вычисления
    """
    table = open_json(json)
    features = table.allFeatures()  
    index_geo = table.tableSchema().geometryIndex()
    result = []
    # Устанавливаем границы изменения прогресса
    progressHandler.setProgressRange(0, len(features))
    progress = 0
    for feature in features: 
        # Тут мы проверяем не отменил ли пользователь операцию через интерфейс
        if progressHandler.isCanceled():
            return
        geom = feature.getAttribute(index_geo)
        if not gm.isValid(geom):
            geom = gm.normalizedGeometry(geom)
        result.append(gm.ConvexHull(geom))
        progress +=1
        # Управляем прогрессом, отсылая текущее значение
        progressHandler.setProgress(progress)
        # Меняем основное сообщение диалога
        progressHandler.setMessage(" Номер текущей геометрии {}".format(progress + 1))
    return result
    

json = {"src": "path/to/tab_file_name.TAB"}
spec = ProgressSpec()
spec.parent = axioma.app.mainWindow
spec.windowTitle = "Получаем минимальный окаймляющий полигон"
spec.dialogType = ProgressSpec.ProgressDialog
result = showLongWait(spec, user_heavy_function, json)
print(result)