Esta página describe cómo empezar a usar Python en Unreal Editor.
¿Por qué Python?
En los últimos años, Python se ha convertido en el lenguaje de facto para los procesos de producción y la interoperabilidad entre aplicaciones 3D, sobre todo en el sector del entretenimiento y multimedia. Esto se debe en parte a la amplia gama de aplicaciones que lo admiten. Dado que la complejidad de los procesos de producción sigue aumentando y el número de aplicaciones implicadas sigue creciendo, tener un lenguaje de secuencia de comandos común facilita la creación y el mantenimiento de sistemas de gestión de recursos a gran escala.
Incluso sin estas consideraciones externas, o sin la necesidad de trabajar con otras aplicaciones, Python es una gran opción si quieres automatizar tus procesos de trabajo dentro de Unreal Editor. Es relativamente fácil empezar a programar aunque no tengas experiencia. Ofrece la posibilidad de crear interfaces de usuario complejas y repletas de funciones a través de módulos como PySide, y hay muchos otros módulos gratuitos útiles disponibles para la comunidad para facilitarte la vida.
Puedes usar Python en Unreal Editor para hacer cosas como:
Construir canalizaciones o procesos de trabajo a gran escala para la gestión de recursos que conecten Unreal Editor con otras aplicaciones 3D que utilices en tu organización.
Automatizar tareas de gestión de recursos que requieren mucho tiempo en Unreal Editor, como generar niveles de detalle (LOD) para mallas estáticas.
Disponer procedimentalmente el contenido de un nivel.
Controlar Unreal Editor desde interfaces de usuario que crees tú mismo con Python.
Cómo configurar tu proyecto para usar Python
La compatibilidad con Python en Unreal Editor la proporciona el complemento Python Script Editor. Tendrás que activar este complemento para tu proyecto actual antes de poder ejecutar secuencias de comandos de Python en el editor.
Actualmente, debes activar el complemento por separado para cada proyecto.
Para activar el complemento:
Abre tu proyecto y ve a Editar > Complementos en el menú principal.
En la ventana Complementos, ve a la sección de Secuenciación de comandos.
Busca el complemento Python Script Editor en el panel de la derecha y marca la casilla Habilitado.También es recomendable activar el complemento Editor Scripting Utilities, que ofrece API simplificadas para muchas de las tareas más comunes del editor. Para obtener más información, consulta Secuenciación de comandos y automatización del editor.
Reinicia el editor.
Python 3.11.8
El complemento Python Script Editor contiene una versión integrada Python 3.11.8.
Esto significa que no tienes que instalar Python por separado en tu ordenador.
Unreal usa Python 3.11.8 por defecto, ya que es una parte importante de la plataforma de referencia de efectos visuales actual.
Para usar una versión distinta de Python, puedes configurar la variable de entorno UE_PYTHON_DIR de tu sistema operativo para que apunte a la instalación que quieres integrar y, a continuación, reconstruir Unreal Engine desde el código fuente.
Formas de ejecutar código de Python en Unreal Editor
Hay varias formas de ejecutar secuencias de comandos de Python en Unreal Editor, cada una diseñada para una situación de uso ligeramente distinta. Puedes elegir la que mejor se adapte a tus necesidades.
A diferencia de los blueprints, el entorno Python solo está disponible en Unreal Editor, no cuando tu proyecto se está ejecutando en Unreal Engine en cualquier modo, incluidos Reproducir en el editor, Juego independiente, ejecutable cooked, etc. Eso significa que puedes usar Python libremente para crear secuencias de comandos y automatizar el editor o construir canalizaciones de producción de recursos, pero actualmente no puedes usarlo como lenguaje de programación de jugabilidad.
La consola de Python en el registro de salida
Puedes cambiar la barra de entrada de la consola de Unreal Editor para que acepte código de Python en lugar de comandos de la consola de Unreal Editor.
Puedes hacerlo en el panel Registro de salida, tal y como se muestra arriba, o abriendo la barra de entrada de la consola con la tecla ~.
Cuando la consola está en modo Python:
Puedes introducir líneas de código de Python en esta consola y hacer que el editor las ejecute de inmediato, como si estuvieras usando una consola interactiva de Python en una ventana de comandos. Esta es la única forma de ejecutar código de Python línea a línea; todos los demás enfoques enumerados a continuación ejecutan un archivo de secuencia de comandos que especifiques.
Puedes ejecutar varias líneas de código a la vez pulsando Mayús+Intro para separar cada línea, o pegando un bloque multilínea que copies desde un editor de texto.
Puedes ejecutar archivos de secuencia de comandos de Python con solo escribir el nombre del archivo en la consola. Si tu secuencia de comandos de Python requiere argumentos de línea de comandos adicionales, inclúyelos después del nombre de tu secuencia de comandos.
Los resultados de la función print integrada de Python también se redirigen al panel Registro de salida.
El comando de consola `py`
Con la consola en modo Cmd, puedes usar el comando py para ejecutar el resto de la línea como código de Python, exactamente como si lo hubieras escrito en la consola de Python descrita anteriormente.
Por ejemplo, este comando ejecuta el archivo de secuencia de comandos especificado:
Línea de comandos
py "C:\MyScripts\my_script.py"No recomendamos ejecutar este comando con el valor del parámetro de línea de comandos ExecCmd al iniciar el editor. Esto puede provocar que tu secuencia de comandos se ejecute antes de que el entorno del editor esté listo, por ejemplo, antes de que el nivel de inicio esté completamente cargado. Consulta las siguientes secciones para ver mejores opciones.
El menú Archivo
El menú Archivo de la ventana principal de Unreal Editor ofrece nuevas opciones que puedes usar para ejecutar archivos de secuencia de comandos de Python.
Usa Ejecutar secuencia de comandos de Python si quieres buscar un nuevo archivo de secuencia de comandos en tu ordenador que no hayas ejecutado antes.
Usa la lista de secuencias de comandos de Python recientes para volver a ejecutar cualquier secuencia de comandos que hayas ejecutado anteriormente. El archivo se vuelve a leer del disco, por lo que si has cambiado la secuencia de comandos entretanto, se ejecuta tu nueva versión.
La línea de comandos
Si inicias Unreal Editor desde la línea de comandos o desde una secuencia de comandos, puedes especificar un archivo Python en los argumentos de la línea de comandos. Si tu secuencia de comandos de Python requiere argumentos de línea de comandos adicionales, inclúyelos después del nombre de tu secuencia de comandos.
Hay dos formas distintas de ejecutar una secuencia de comandos de Python desde la línea de comandos. En ambos casos, el editor se cierra inmediatamente después de ejecutar tu secuencia de comandos de Python.
Opción 1: Editor completo En este método, se inicia la versión completa de Unreal Editor, se abre el proyecto especificado, se carga el nivel de inicio por defecto y se ejecuta tu secuencia de comandos de Python cuando todo esté cargado y listo. Este enfoque es útil si necesitas que tu secuencia de comandos interactúe con contenido del proyecto o de un nivel que pueda tardar en cargarse.
Añade el argumento ExecutePythonScript a la línea de comandos y establece su valor en la ruta y el nombre de archivo de la secuencia de comandos de Python que quieras ejecutar. Por ejemplo:
Línea de comandos
> UnrealEditor-Cmd.exe "C:\projects\MyProject.uproject" -ExecutePythonScript="c:\my_script.py"El enfoque anterior requiere que actives el complemento Editor Scripting Utilities para tu proyecto. Ya debes haber activado el complemento Python Scripting Plugin en el proyecto de Unreal Engine que especifiques en la línea de comandos.
Opción 2: Commandlet Este enfoque es muy rápido de ejecutar e incluso puedes ejecutar tus secuencias de comandos sin interfaz gráfica de usuario sin necesidad de abrir la IU del editor.
Añade los siguientes argumentos a la línea de comandos para UnrealEditor-Cmd.exe: -run=pythonscript -script=<script_file_or_code>. <script_file_or_code> adopta cualquiera de los siguientes valores:
La ruta y el nombre de archivo de una secuencia de comandos de Python que quieras ejecutar.
Instrucciones y comandos de Python que quieras ejecutar. Si es necesario, puedes usar
\nen la cadena como carácter de escape de saltos de línea.
Por ejemplo:
Línea de comandos
> UnrealEditor-Cmd.exe "C:\projects\MyProject.uproject" -run=pythonscript -script="c:\\my_script.py"o:
Línea de comandos
> UnrealEditor-Cmd.exe "C:\projects\MyProject.uproject" -run=pythonscript -script="a=5 \nb=10 \nc=a+b \nf=open('D:\myfile.txt','w+') \nf.write(str(c)) \nf.close()"Este commandlet no carga niveles automáticamente, así que cuando escribas tu secuencia de comandos, añade la siguiente línea como lo primero que haga:
Línea de comandos
unreal.get_editor_subsystem(unreal.LevelEditorSubsystem).load_level("/Game/maps/UVlayoutTest.UVlayoutTest")Ya debes haber activado el complemento Python Scripting Plugin en el proyecto de Unreal Engine que especifiques en la línea de comandos.
El archivo `init_unreal.py`
Si el editor detecta un archivo de secuencia de comandos llamado init_unreal.py en cualquiera de las rutas para las que está configurado (consulta «Rutas de Python en Unreal Editor» más abajo), ejecuta automáticamente esa secuencia de comandos.
Este es un buen enfoque para situaciones en las que estás trabajando en un proyecto o complemento y sabes que todos los que trabajan con ese contenido necesitan ejecutar el mismo código de inicialización cada vez que se inicia el editor. Podrías poner tu código de inicialización dentro de una secuencia de comandos con este nombre y colocarlo en la carpeta Content/Python dentro de ese proyecto o complemento.
Scripts de inicio
En la configuración del proyecto, puedes especificar cualquier número de secuencias de comandos de Python que quieras ejecutar cada vez que abras ese proyecto. El editor ejecuta estas secuencias de comandos después de que el nivel de inicio por defecto esté completamente cargado.
Selecciona Editar > Configuración del proyecto.... En la lista Complementos, selecciona Python. Después, añade tus secuencias de comandos al ajuste Secuencias de comandos de inicio:
Reinicia Unreal Editor cuando hayas terminado. La próxima vez que el editor cargue tu proyecto, debería ejecutar las nuevas secuencias de comandos de inicio.
Desde blueprints exclusivos del editor
El complemento Python Script expone nuevos nodos a la secuenciación de comandos visual de Blueprint que puedes usar para ejecutar fragmentos de código de Python o archivos durante la evaluación de un grafo de blueprint.
Los nodos de ejecución de Python solo están disponibles en clases de blueprint exclusivas del editor, como los widgets de utilidad del editor y los blueprints de utilidad del editor. Consulta Secuenciación de comandos del editor mediante blueprints. No puedes usar este método en ninguna clase de blueprint que esté disponible en tiempo de ejecución, como una clase que derives directamente de un actor.
Encontrarás los siguientes nodos en la sección Python > Ejecución de la paleta de blueprints.
Execute Python Script | Ejecuta el código de Python literal que pases o escribas en la entrada Comando de Python. Es la forma recomendada de llamar a Python desde blueprints y sustituye a la creación de un nuevo tipo BlueprintFunctionLibrary(BPFL) en Python.
Este nodo no puede ejecutar archivos. Solo puede ejecutar líneas de código de Python. | |
Execute Python Command | Ejecuta el código o archivo Python literal que pasas o escribes en la entrada Secuencia de comandos de Python. El nodo intentará determinar, en función de tu entrada, si se trata de un código literal o de un nombre de archivo. -La salida Valor devuelto se activa si el código o archivo de Python se ejecutó correctamente; de lo contrario, aparece desactivada. Si está desactivada, puedes encontrar los errores en el registro de salida. | |
Execute Python Command (Advanced) | Ejecuta el código o archivo Python literal que pasas o escribes en la entrada Secuencia de comandos de Python. Este nodo es similar a Execute Python Command, pero ofrece algunas entradas y salidas adicionales que pueden ser útiles en algunas situaciones.
|
Entorno Python y rutas en Unreal Editor
Cuando usas una ruta relativa para ejecutar una secuencia de comandos de Python o para importar otro módulo con el comando import en una de tus secuencias de comandos, la secuencia de comandos que ejecutes o importes puede encontrarse en cualquier ruta que figure en la variable sys.path de tu entorno Python.
Unreal Editor añade automáticamente varias rutas a esta lista sys.path:
La subcarpeta Content/Python de la carpeta de tu proyecto.
La subcarpeta Content/Python de la instalación principal de Unreal Engine.
La subcarpeta Content/Python de la carpeta de cada complemento activado.
La carpeta Documentos/UnrealEngine/Python dentro de tu directorio de usuario. Por ejemplo, en Windows 10, esto sería
C:/Usuarios/nombredeusuario/Documentos/UnrealEngine/Python
También puedes añadir tus propias rutas a esta lista usando cualquiera de los siguientes métodos:
En tu configuración del proyecto. Selecciona Editar > Configuración del proyecto.... En la lista Complementos, selecciona Python. Después, añade las rutas al ajuste Rutas adicionales. Reinicia Unreal Editor cuando hayas terminado.
Añade las rutas al valor de la variable de entorno
UE_PYTHONPATH(oPYTHONPATHsi has desactivado la opción de entorno del intérprete aislado del editor) en tu sistema operativo y, a continuación, reinicia Unreal Editor.Añade las rutas directamente a la lista
sys.pathdentro de una secuencia de comandos de Python o en la consola de Python.
Para obtener más información, consulta sys.path en la documentación de Python.
Por defecto, el intérprete de Python integrado en Unreal Engine se ejecuta en modo aislado. Puedes desactivar el modo aislado seleccionando Editar > Configuración del proyecto > Complementos > Python > Aislar entorno de intérprete.
Para obtener más información, consulta la opción -I de la línea de comandos en la documentación de Python.
El motor siempre analiza la variable de entorno UE_PYTHONPATH y su contenido se añade a sys.path, independientemente de las opciones de modo aislado que selecciones. UE_PYTHONPATH tiene la misma función que la variable PYTHONPATH, pero nunca debe modificarse con software de terceros.
Acerca de la API de Python de Unreal Editor
El complemento Python Script Editor expone una amplia gama de clases y funciones que puedes usar para interactuar con Unreal Editor, los recursos de tu proyecto y el contenido de tus niveles. Toda esta API se encuentra en el módulo unreal. Para acceder a él, importa este módulo al principio de cualquier secuencia de comandos de Python que ejecutes en el entorno de Python del editor:
import unrealEl módulo unreal expone prácticamente todo lo que se expone desde C++ en los blueprints en tu entorno del editor. No se genera previamente; refleja automáticamente todo lo que esté disponible en los blueprints de tu editor. A medida que actives nuevos complementos en Unreal Editor, todo lo que esos complementos expongan en los blueprints también estará disponible en Python. Lo mismo ocurre con cualquier código C++ que escribas en tu proyecto y expongas en los blueprints.
La API de Python hace todo lo posible para exponer las API nativas de UE de la forma más sencilla posible para los desarrolladores de Python. Por ejemplo:
Los tipos de datos simples se convierten de forma transparente entre Python y los tipos nativos siempre que sea necesario.
Cuando pasas una lista, un conjunto o un diccionario de Python, se convierte automáticamente en una matriz, un conjunto o un mapa de Unreal. Cuando recuperas una lista, un conjunto o un diccionario devuelto por una función de la API, en realidad estás obteniendo una instancia de una clase de UE, pero su API es totalmente coherente con el tipo de diccionario, conjunto o lista de Python.Las clases de Python mantienen la misma jerarquía de herencia que los tipos nativos que representan. Eso significa, por ejemplo, que puedes usar las funciones integradas de Python
isinstance()ytype()para comprobar si un objeto se deriva de o coincide con una clase determinada.La API intenta encontrar un buen equilibrio entre las convenciones de nomenclatura usadas en Unreal para C++ y blueprints, por un lado, y las convenciones de nomenclatura de Python, por otro. Las clases y los objetos de la API de Python tienen los mismos nombres que en los blueprints. Suele ser el mismo que sus tipos nativos, omitiendo el prefijo (p. ej.,
UoT). Los nombres de funciones y propiedades aparecen automáticamente en minúsculas, comosnake_case. Así, por ejemplo, las funciones suelen tener nombres comoUE.StaticMeshActor.get_actor_transform(). Los nombres de los valores de enumeración aparecen automáticamente en mayúsculasSNAKE_CASE.Todas las funciones expuestas pueden aceptar parámetros ordenados o parámetros con nombre en cualquier orden. Por ejemplo, las siguientes dos llamadas a función son exactamente equivalentes:
C++unreal.get_editor_subsystem(unreal.StaticMeshEditorSubsystem).join_static_mesh_actors(list_of_actors, my_options) unreal.get_editor_subsystem(unreal.StaticMeshEditorSubsystem).join_static_mesh_actors(join_options=my_options, actors_to_join=list_of_actors)
Referencia de la API
Para obtener más información sobre todas las clases y funciones de la API de Python de UE, consulta la referencia de la API:
Referencia de la API de Python de Unreal Editor
La documentación de la API no es una lista exhaustiva de todo lo que los complementos pueden exponer a Python. Si has instalado complementos adicionales que no están incluidos en la referencia de la API y necesitas ver cómo se exponen sus funciones de secuenciación de comandos en Python, puedes generar tu propia versión local de referencia de la API que contenga documentación para los complementos que necesitas. Para obtener instrucciones, consulta el archivo Readme en Engine\Plugins\Experimental\PythonScriptPlugin\SphinxDocs dentro de tu carpeta de instalación de Unreal Engine.
Prácticas recomendadas para usar la API de Python
Esta sección trata algunos aspectos que es importante tener en cuenta cuando usas la API de Python.
Trabajar con recursos
Si necesitas trabajar con recursos en tu proyecto, usa siempre funciones de la API de Python de UE para hacerlo. No uses nunca los módulos de gestión de archivos integrados en Python para trabajar directamente con tus archivos de recursos en el disco. Por ejemplo, si necesitas mover un recurso a otra carpeta, no uses funciones de Python como os.rename o shutil.move. Los proyectos y recursos de UE contienen referencias de contenido interno que puedes romper si no respetas esta regla.
En su lugar, recomendamos usar la API UE.EditorAssetLibrary que proporciona el complemento Editor Scripting Utilities o la clase UE.AssetTools integrada en la API de Python de UE.
Cómo cambiar las propiedades del editor
Puedes usar Python para acceder a los objetos de tu proyecto y ajustar muchas propiedades de configuración en esos objetos mediante programación. Por ejemplo, tu secuencia de comandos de Python podría acceder a los actores de malla estática en el nivel actual y establecer propiedades, por ejemplo, si los actores pueden recibir daño o si deben ocultarse en el juego. También puedes recuperar sus componentes de malla estática y configurar propiedades en esos componentes, como sus ajustes de Lightmass o incluso el recurso de malla estática al que están vinculados.
Estas propiedades pueden exponerse en Python de dos formas distintas:
Los elementos con el indicador BlueprintReadOnly o BlueprintReadWrite se exponen como propiedades simples en el objeto.
Puedes leer y modificar estas propiedades del mismo modo que accedes a cualquier propiedad de objeto de Python.Los elementos con el indicador ViewAnywhere o EditAnywhere aparecen como «propiedades del editor».
Puedes leer y escribir estos valores usando un par de funciones especiales expuestas por cada objeto:set_editor_property()yget_editor_property().
En la referencia de la API de cada clase, encontrarás una lista de las propiedades del editor justo después de la descripción de la clase. Estos son todos los valores que puedes establecer y obtener con las funciones set_editor_property() y get_editor_property(). Cada vez que necesites establecer u obtener una propiedad de configuración en un objeto, consulta primero esta lista para ver si la propiedad que quieres está ahí.
Cuando necesites leer un valor que está expuesto como propiedad de un objeto y como propiedad del editor, el resultado de acceder directamente a la propiedad suele ser el mismo que llamando a la función
get_editor_property(). Sin embargo, la funciónget_editor_property()suele tener acceso a propiedades que no están expuestas directamente en el objeto de Python.Cuando necesites establecer un valor que esté expuesto como propiedad de un objeto y como propiedad del editor, en la mayoría de los casos deberías usar la función
set_editor_property()para establecer el valor en lugar de establecer el valor directamente en el objeto. Cuando ajustas propiedades en la IU, el editor suele realizar operaciones adicionales en segundo plano: cambios previos y posteriores a la edición. Estas operaciones suelen responder a las elecciones que hagas de alguna manera y mantienen la IU del editor sincronizada con el estado del objeto en el mundo del juego. Si modificas estas propiedades directamente en el objeto de Python, este código del editor no se ejecutará automáticamente. Por otro lado, cuando llamas aset_editor_property()para establecer el estado de una propiedad, sí activas este código de edición previa y posterior, exactamente como si cambiaras los ajustes en el panel Detalles de la IU del editor.
Por ejemplo, los objetos del reproductor multimedia tienen un ajuste Reproducir al abrir:
Esto se refleja en la clase unreal.MediaPlayer dentro del miembro de la clase play_on_open:
import unreal
obj = unreal.MediaPlayer()
# Modifying a property directly can have different results
# than changing settings in the Editor UI.
# Generally you'll want to avoid setting these values directly, like this:
obj.play_on_open = True
# This way of accessing the property will have exactly the same
# result as changing the setting in the Editor UI:
obj.set_editor_property("play_on_open", True)
# Both ways of reading the value are equivalent.
Usa tipos de Unreal siempre que sea posible
Siempre que necesites las utilidades disponibles en la API de Python de UE, como clases para operaciones matemáticas o la manipulación de coordenadas 3D, te recomendamos usar las utilidades de Unreal en lugar de tus propias implementaciones. Las versiones de Unreal están optimizadas para ofrecer el mejor rendimiento en el entorno del motor.
Por ejemplo, cuando necesites manipular coordenadas en un espacio 3D, usa la clase unreal.Vector:
import unreal
v1 = unreal.Vector()
v1.x = 10
v2 = unreal.Vector(10, 20, 30)
v3 = (v1 + v2) * 2
print(v3)Registro y feedback
El objeto unreal expone funciones que puedes usar en tu código para enviar mensajes de registro, advertencia y error a través del mismo sistema de mensajería que usan todos los subsistemas de Engine y del editor. Recomendamos usar este marco de registro estandarizado cada vez que tu secuencia de comandos necesite enviar un mensaje al usuario.
Usa
unreal.log()para los mensajes informativos. Para tu comodidad, la funciónprint()de Python también se ha implementado para que pase porunreal.log()internamente.Usa
UE.log_warning()para alertar a los usuarios sobre posibles problemas.Usa
unreal.log_error()en caso de problemas graves que impidan que tu secuencia de comandos se ejecute como se esperaba.
Tus mensajes aparecen en el panel Registro de salida, junto con los mensajes enviados por otros subsistemas:
Compatibilidad con las acciones de deshacer y rehacer
Tus secuencias de comandos pueden aprovechar al máximo el sistema de acciones de deshacer/rehacer integrado en Unreal Editor.
Cada transacción que definas puede contener cualquier cantidad de operaciones de Python. Con estas transacciones, puedes agrupar grandes operaciones (u operaciones en muchos objetos) diferentes en una sola entrada en el historial de deshacer/rehacer. Por lo general, si tu secuencia de comandos pretende realizar un cambio determinado en varios objetos, no querrás una entrada separada en el historial de deshacer/rehacer para cada cambio; querrás una entrada que deshaga todos los cambios en todos los objetos.
Para definir una transacción, usa el ámbito de unreal.ScopedEditorTransaction. Por ejemplo, si ejecutas este código:
import unreal
obj = unreal.MediaPlayer()
with unreal.ScopedEditorTransaction("My Transaction Test") as trans:
obj.set_editor_property("play_on_open", False)
obj.set_editor_property("vertical_field_of_view", 80)El panel Historial de cambios del editor ahora enumera esa transacción por nombre:
Como regla general, tus transacciones con ámbito pueden contener cualquier operación que también se pueda deshacer en la IU del editor. Sin embargo, no todas las operaciones del editor se pueden deshacer. Por ejemplo, no puedes deshacer la importación de un modelo en la IU del editor, por lo que intentar importar un modelo dentro de una transacción unreal.ScopedEditorTransaction no funcionará como cabría esperar.
Cuadros de diálogo de progreso para operaciones lentas
Si tus secuencias de comandos necesitan trabajar en muchos recursos o actores en la misma operación, puede que tarden un poco en completarse. Sin embargo, mientras Unreal Editor ejecuta una secuencia de comandos de Python, su IU queda bloqueada para otras interacciones del usuario. Para dar al usuario información sobre el progreso de una tarea grande y evitar que el editor parezca bloquearse o colgarse, puedes usar el ámbito de unreal.ScopedSlowTask.
Por ejemplo:
import unreal
total_frames = 100
text_label = "Working!"
with unreal.ScopedSlowTask(total_frames, text_label) as slow_task:
slow_task.make_dialog(True) # Makes the dialog visible, if it isn't already
for i in range(total_frames):
if slow_task.should_cancel(): # True if the user has pressed Cancel in the UI
break
slow_task.enter_progress_frame(1) # Advance progress by one frame.
# You can also update the dialog text in this call, if you want.