# Regalo
Regalo provee una insterfaz de usuario para instalar cualquier archivo ejecutable (.exe) para windows. `Regalo` sirve para crear un instalador para tus ejecutables de forma rápida y sencilla basado en `flet`.
## Funcionamiento
Regalo proporciona una interfaz y funciones predefinidas para cada paso de la instalación (páginas).
Si conoces sobre flet o quieres una mayor personalización tendrás que crear funciones que representarán a cada página o etapa. Ejemplo:
```python
import flet as ft
from Regalo import Regalo, Controles, InstallerVars
def bienvenida(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:
txt_titulo = ft.Text("Bienvenido a Regalo", size=18)
contenido = ft.Column(
height=200,
controls=[
ft.Container(
ft.Text("Bienvenido a Regalo, una forma sencilla de crear instaladores para tus ejecutables! Espero lo disfrutes"),
alignment=ft.alignment.top_left,
)
],
)
btn_next = controles.next
btn_next.current.on_click = lambda _: page.go("/paginaInstalacion")
return (
ft.Row([ txt_titulo ], alignment=ft.MainAxisAlignment.CENTER),
ft.Container(contenido, border=ft.border.all(1)),
ft.Row([ btn_accept ])
)
```
Todas las funciones reciben 3 argumentos y devuleven una tupla de elementos de flet. El primer argumento que es `page` hace referencia al objeto `page` de flet, que es la propia app o página que flet crea, el siguiente argumento son los controles y que quiere decir con esto?
-------------
## Controles
Regalo proporciona una forma sencilla de ir a las siguientes etapas de la instalación, ya sea seguir a delante, regresar, cerrar el instalador o iniciar la instalación, esto se logra mediante los `Controles` que son esos botones por defecto que proporciona regalo que son:
- `next`: Boton para ir a la siguiente página
- `back`: Boton para regresar a la página anterior
- `cancel`: Boton para cerrar el instalador
- `install`: Boton para empezar con el procedimiento de instalación
Estos controles son totalmente personalizables, se puede cambiar texto que aparece en el boton, se pueden agregar o quitar botones y modificar el funcionamientos de estos, todo esto puede ser especificado tanto al iniciar instanciar la clase `Regalo` o modificar durante la ejecución del instalador.
Los controles establecidos para el instalador se encuentran en el atributo `controles_inst` de la clase `Regalo` que es una instancia de la clase `Controles`, por lo que puedes modificar esa instancia agregando o quitando controles o reemplazando la instancia por otra.
La clase `Controles` provee métodos para el manejo de los controles, por defecto trae un soporte para botones y progressbar con sus métodos:
### `Controles.get_btn(self, id: str) -> flet.Ref[flet.ElevatedButton]`
Método que devuelve una referencia (Ref) a un botón elevado (ElevatedButton) almacenado en el diccionario de botones (botones) de la instancia de la clase Controles. El botón es identificado por su id. Esta referencia permite acceder y manipular el botón correspondiente.
Parámetros:
- `id (str)`: Identificador único del botón.
Retorno:
- `flet.Ref[flet.ElevatedButton]`: Referencia al botón correspondiente.
### `Controles.agregar_boton(self, id, texto, **kwargs:dict)`
Método que agrega un nuevo botón (ElevatedButton) a la instancia de la clase Controles. El botón es identificado por su id y se crea con el texto proporcionado y cualquier argumento adicional especificado en el diccionario kwargs.
- `id`: Identificador único del nuevo botón.
- `texto`: Texto que se mostrará en el botón.
- `**kwargs (dict)`: Argumentos adicionales para la configuración del botón.
### `Controles.get_control(self, id: str) -> flet.Ref[Any]`
Método que devuelve una referencia (Ref) a un control agregado, ya sea un boton, progressbar u otro. Esta referencia permite acceder y manipular el control correspondiente.
Parámetros:
`id (str)`: Identificador único de la barra de progreso.
Retorno:
- `flet.Ref[Any]`: Referencia a un control.
### `Controles.agregar_pb(self, id)`
Método que agrega una nueva barra de progreso (ProgressBar) a la instancia de la clase Controles. La barra de progreso es identificada por su id.
Parámetros:
`id`: Identificador único de la nueva barra de progreso.
Retorno:
`flet.ProgressBar`: Objeto de la barra de progreso recién creado.
### `Controles.eliminar_control(self, id)`
Método que elimina un control, ya sea un botón elevado o una barra de progreso, de la instancia de la clase Controles. El control a eliminar se identifica por su id.
Parámetros:
`id`: Identificador único del control a eliminar.
Para crear el instalador se debe llamar a la clase `Regalo` y como argumentos debe recibir el nombre de tu aplicación, el path del archivo `.exe`, las páginas que representa las etapas de la instalación como una página individual de flet:
## Páginas
Las páginas o etapas son los pasos de instalación que se muestran al instalar un programa, estas páginas se pueden configurar, puedes añadir, quitar o modificar, todo esto con ayuda de `flet`. Si no conoces, no dominas o la pereza te controla puedes usar las funciones predeterminadas.
### Nota:
Todas estas funciones predeterminadas retornan una tupla y estas funciones deben ser usadas dentro de otra función que representará a la página, ejemplo:
```python
def main(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:
componentes = funcion_predeterminada_regalo(*args)
return componentes
# se puede hacer directamente:
# return funcion_predeterminada_regalo(*args)
paginas = Paginas({'/inicio':main})
```
### `def terminos_condiciones(page, controles, titulo:str, file:TextIOWrapper, txt_aceptar:str, sig_ruta:str) -> tuple`
Genera una interfaz para visualizar términos y condiciones.
Parámetros:
- `page (Page)`: Página actual de la aplicación.
- `controles (Controles)`: Controles de la aplicación.
- `titulo (str)`: Título de la sección de términos y condiciones.
- `file (TextIOWrapper)`: Archivo de texto con los términos y condiciones.
- `txt_aceptar (str)`: Texto del checkbox de aceptación.
- `sig_ruta (str)`: Ruta a la siguiente sección en caso de aceptación.
Retorno:
- `(tuple)`: Contiene la interfaz generada para la sección de términos y condiciones.
### `def config_instalacion(page, controles, varsInstal, titulo, text_seleccionar_carpeta, text_info, text_cambiar_ruta, text_expacio:str, sig_ruta:str) -> tuple`
Genera una interfaz para la sección de instalación.
Parameters:
- `page (Page)`: Página actual de la aplicación.
- `controles (Controles)`: Controles de la aplicación.
- `varsInstal (InstallerVars)`: Variables relacionadas con la instalación.
- `titulo (str)`: Título de la sección de instalación.
- `text_seleccionar_carpeta (str)`: Texto para la selección de carpeta.
- `text_info (str)`: Información adicional.
- `text_cambiar_ruta (str)`: Texto para cambiar la ruta de instalación.
- `text_expacio (str)`: Texto que muestra el espacio disponible.
- `sig_ruta (str)`: Ruta a la siguiente sección.
Returns:
- `tuple`: Contiene la interfaz generada para la sección de instalación.
### `def config(page, controles, varsInstal, titulo, txt_btn_instalar:str, txt_checkbox_path, msg_agregar_path, variable_agregar_path, sig_ruta:str) -> tuple`
Genera una interfaz para la configuración antes de la instalación.
Parameters:
- `page (Page)`: Página actual de la aplicación.
- `controles (Controles)`: Controles de la aplicación.
- `varsInstal (InstallerVars)`: Variables relacionadas con la instalación.
- `titulo (str)`: Título de la sección de configuración.
- `txt_btn_instalar (str)`: Texto del botón de instalación.
- `txt_checkbox_path (str)`: Texto del checkbox de agregar al PATH.
- `msg_agregar_path (str)`: Mensaje informativo sobre agregar al PATH.
- `variable_agregar_path (str)`: Variable que indica si agregar al PATH.
- `sig_ruta (str)`: Ruta a la siguiente sección.
Returns:
- `tuple`: Contiene la interfaz generada para la sección de configuración.
### `def instalacion(page, controles, id_btn_back, id_btn_install, pbRef:ft.Ref[ft.ProgressBar], msg_progreso) -> None`
Esta función no retorna una tupla. La función de instalación debe ser implementada por el usuario.
Parameters:
- `page (Page)`: Página actual de la aplicación.
- `controles (Controles)`: Controles de la aplicación.
- `id_btn_back (str)`: Identificador del botón de retroceso.
- `id_btn_install (str)`: Identificador del botón de instalación.
- `pbRef (ft.Ref[ft.ProgressBar])`: Referencia a la barra de progreso.
- `msg_progreso (str)`: Mensaje de progreso de instalación.
- Ejemplo de implementación:
```python
def pag_instalar(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:
pbRef = controles.get_control("pb")
instalacion(page, controles, varsInstal, "back", "install", pbRef, "Instalando...")
# desactivamos la opcion de cancelar
controles.cancel.current.visible = False
# regalo es una instancia de la clase Regalo que proporciona la función por defecto instalar_regalo
# se le pasa la progressbar y la ruta donde se debe instalar el programa (hecho en pasos anteriores)
regalo.instalar_regalo(pbRef.current, varsInstal.path_instalacion)
# Se agrega el boton para cerrar el instalador
controles.agregar_boton("fin", "Cerrar", on_click=lambda _: page.window_destroy())
# Se muestra un mensaje satisfactorio
# Tambien se puede realizar una comprobación para saber si fue todo correcto
return (ft.Text("Instalación finalizada", size=18), ft.Text("El programa se ha instalado correctamente", size=14))
paginas = Paginas({'/instalacion': pag_instalar})
```
## Ejemplo de uso
```python
from Regalo import Regalo, Paginas, Controles, InstallerVars
from Regalo import helpers
from pathlib import Path
from os import environ
import flet as ft
from elevate import elevate
def main(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:
txt_titulo_terminos = ft.Text("Terminos y condiciones", size=18)
terminos_condiciones = ft.Text(open("terminos_condiciones.txt", "r").read(), size=14)
controles.next.current.disabled = True
contenido_term_cond = ft.Column(
height=200,
scroll=ft.ScrollMode.ALWAYS,
controls=[
ft.Container(
terminos_condiciones,
alignment=ft.alignment.top_left,
)
],
)
def habilitar_next(e):
btn_next.current.disabled = not btn_accept.value
page.update()
btn_accept = ft.Checkbox(label="Acepto los terminos y condiciones", on_change=habilitar_next)
btn_next = controles.next
btn_next.current.on_click = lambda _: page.go("/pathInstall")
return (
ft.Row([ txt_titulo_terminos ], alignment=ft.MainAxisAlignment.CENTER),
ft.Container(contenido_term_cond, border=ft.border.all(1)),
ft.Row([ btn_accept ])
)
def pag_config_inst(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:
if controles["install"]:
controles.install.current.visible = False
controles.next.current.visible = True
controles.next.current.disabled = False
controles.next.current.on_click = lambda _: page.go("/config")
def select_file(e: ft.FilePickerResultEvent):
filepicker.get_directory_path("Selecciona la carpeta...")
def return_path(e: ft.FilePickerResultEvent):
if not e.path: return
varsInstal.path_instalacion = e.path
directory_path.value = e.path
directory_path.update()
directory_path = ft.Text(value=varsInstal.path_instalacion, expand=1)
filepicker = ft.FilePicker(on_result=return_path)
controles.appbar.title= ft.Text("Instalación")
return (
ft.Text("El prgrama se instalará en la siguiente carpeta", size=16),
ft.Text("Si desea seleccionar una carpeta, haga clic en el icono de la carpeta.", size=14),
ft.Container(
content=ft.Row(
[
ft.IconButton(icon=ft.icons.FOLDER_OPEN, bgcolor=ft.colors.PURPLE_700, on_click=select_file),
filepicker,
directory_path
],
alignment=ft.MainAxisAlignment.START,
),
padding=10,
height=140,
alignment=ft.alignment.top_left
),
ft.Row([
ft.Text(f"Se requiere al menos {helpers.get_format_size(varsInstal.path_instalador)} de espacio en disco", size=15),
])
)
def pag_config(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:
controles.appbar.title = ft.Text("Configuración")
controles.agregar_boton("install", "Install", on_click=lambda _: page.go("/instalar"))
controles.next.current.visible = False
def agregar_al_Path(e):
if not agregar_path.value: return
varsInstal["agregar_path"] = True
agregar_path = ft.Checkbox(label="Agregar al PATH", on_change=agregar_al_Path)
return (
ft.Text("Desea agregar el comando ktw al path?", size=18),
agregar_path
)
def pag_instalar(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:
controles.appbarRef.current.visible = False
controles.eliminar_control("back")
controles.eliminar_control("install")
pbRef = controles.get_control("pb")
page.views.append(
ft.View(
page.route,
[
controles.appbarRef.current,
ft.Column([ft.Text("Instalando...", size=15), ft.ProgressBar(ref=pbRef, width=500)]),
]
)
)
page.update()
controles.cancel.current.visible = False
regalo.instalar_regalo(pbRef.current, varsInstal.path_instalacion)
controles.agregar_boton("fin", "Cerrar", on_click=lambda _: page.window_destroy())
return (ft.Text("Instalación finalizada", size=18), ft.Text("El programa se ha instalado correctamente", size=14))
def config(page:ft.Page, controles:Controles, varsInstal:InstallerVars):
controles.appbarRef.current.bgcolor = ft.colors.BLUE_600
page.vertical_alignment = ft.MainAxisAlignment.CENTER
page.window_width = 550
page.window_height = 400
page.window_resizable = False
page.window_maximizable = False
page.window_center()
page.title = "Ktw installer"
paginas = Paginas({'/pathInstall':pag_config_inst, '/config':pag_config, "/instalar":pag_instalar})
path_ktw = Path(__file__).parent / "app.exe"
vars_config = {
"path_instalacion": Path(environ["USERPROFILE"]) / "KTW",
"path_instalador": path_ktw,
"agregar_path": False,
"instalacion_terminada": False,
}
if __name__ == "__main__":
elevate(show_console=False)
regalo = Regalo("ktw", path_ktw, paginas, vars_config, func_config=config)
regalo.abrir(main)
```
Raw data
{
"_id": null,
"home_page": "https://github.com/nakato156/Regalo",
"name": "Regalo",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "windows,installer,exe,executable,package",
"author": "Nakato",
"author_email": "christianvelasces@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/00/46/1f7f7ebed6da91f6b9642ed2e8a4245ccb15f4c564c28766980afca99d6f/Regalo-0.4.2.tar.gz",
"platform": null,
"description": "# Regalo\r\n\r\nRegalo provee una insterfaz de usuario para instalar cualquier archivo ejecutable (.exe) para windows. `Regalo` sirve para crear un instalador para tus ejecutables de forma r\u00e1pida y sencilla basado en `flet`.\r\n\r\n## Funcionamiento\r\nRegalo proporciona una interfaz y funciones predefinidas para cada paso de la instalaci\u00f3n (p\u00e1ginas).\r\n\r\nSi conoces sobre flet o quieres una mayor personalizaci\u00f3n tendr\u00e1s que crear funciones que representar\u00e1n a cada p\u00e1gina o etapa. Ejemplo:\r\n\r\n```python\r\nimport flet as ft\r\nfrom Regalo import Regalo, Controles, InstallerVars\r\n\r\ndef bienvenida(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:\r\n txt_titulo = ft.Text(\"Bienvenido a Regalo\", size=18)\r\n \r\n contenido = ft.Column(\r\n height=200,\r\n controls=[\r\n ft.Container(\r\n ft.Text(\"Bienvenido a Regalo, una forma sencilla de crear instaladores para tus ejecutables! Espero lo disfrutes\"),\r\n alignment=ft.alignment.top_left,\r\n )\r\n ],\r\n )\r\n\r\n btn_next = controles.next\r\n btn_next.current.on_click = lambda _: page.go(\"/paginaInstalacion\")\r\n\r\n return (\r\n ft.Row([ txt_titulo ], alignment=ft.MainAxisAlignment.CENTER),\r\n ft.Container(contenido, border=ft.border.all(1)),\r\n ft.Row([ btn_accept ])\r\n )\r\n```\r\nTodas las funciones reciben 3 argumentos y devuleven una tupla de elementos de flet. El primer argumento que es `page` hace referencia al objeto `page` de flet, que es la propia app o p\u00e1gina que flet crea, el siguiente argumento son los controles y que quiere decir con esto?\r\n\r\n-------------\r\n\r\n## Controles\r\n\r\nRegalo proporciona una forma sencilla de ir a las siguientes etapas de la instalaci\u00f3n, ya sea seguir a delante, regresar, cerrar el instalador o iniciar la instalaci\u00f3n, esto se logra mediante los `Controles` que son esos botones por defecto que proporciona regalo que son:\r\n\r\n- `next`: Boton para ir a la siguiente p\u00e1gina\r\n- `back`: Boton para regresar a la p\u00e1gina anterior\r\n- `cancel`: Boton para cerrar el instalador\r\n- `install`: Boton para empezar con el procedimiento de instalaci\u00f3n\r\n\r\nEstos controles son totalmente personalizables, se puede cambiar texto que aparece en el boton, se pueden agregar o quitar botones y modificar el funcionamientos de estos, todo esto puede ser especificado tanto al iniciar instanciar la clase `Regalo` o modificar durante la ejecuci\u00f3n del instalador.\r\n\r\nLos controles establecidos para el instalador se encuentran en el atributo `controles_inst` de la clase `Regalo` que es una instancia de la clase `Controles`, por lo que puedes modificar esa instancia agregando o quitando controles o reemplazando la instancia por otra. \r\n\r\nLa clase `Controles` provee m\u00e9todos para el manejo de los controles, por defecto trae un soporte para botones y progressbar con sus m\u00e9todos:\r\n\r\n### `Controles.get_btn(self, id: str) -> flet.Ref[flet.ElevatedButton]`\r\n\r\nM\u00e9todo que devuelve una referencia (Ref) a un bot\u00f3n elevado (ElevatedButton) almacenado en el diccionario de botones (botones) de la instancia de la clase Controles. El bot\u00f3n es identificado por su id. Esta referencia permite acceder y manipular el bot\u00f3n correspondiente.\r\n\r\nPar\u00e1metros:\r\n\r\n- `id (str)`: Identificador \u00fanico del bot\u00f3n.\r\n\r\nRetorno:\r\n\r\n- `flet.Ref[flet.ElevatedButton]`: Referencia al bot\u00f3n correspondiente.\r\n\r\n### `Controles.agregar_boton(self, id, texto, **kwargs:dict)`\r\n\r\nM\u00e9todo que agrega un nuevo bot\u00f3n (ElevatedButton) a la instancia de la clase Controles. El bot\u00f3n es identificado por su id y se crea con el texto proporcionado y cualquier argumento adicional especificado en el diccionario kwargs.\r\n\r\n- `id`: Identificador \u00fanico del nuevo bot\u00f3n.\r\n- `texto`: Texto que se mostrar\u00e1 en el bot\u00f3n.\r\n- `**kwargs (dict)`: Argumentos adicionales para la configuraci\u00f3n del bot\u00f3n.\r\n\r\n### `Controles.get_control(self, id: str) -> flet.Ref[Any]`\r\n\r\nM\u00e9todo que devuelve una referencia (Ref) a un control agregado, ya sea un boton, progressbar u otro. Esta referencia permite acceder y manipular el control correspondiente.\r\n\r\nPar\u00e1metros:\r\n\r\n`id (str)`: Identificador \u00fanico de la barra de progreso.\r\n\r\nRetorno:\r\n\r\n- `flet.Ref[Any]`: Referencia a un control.\r\n\r\n\r\n### `Controles.agregar_pb(self, id)`\r\n\r\nM\u00e9todo que agrega una nueva barra de progreso (ProgressBar) a la instancia de la clase Controles. La barra de progreso es identificada por su id.\r\n\r\nPar\u00e1metros:\r\n\r\n`id`: Identificador \u00fanico de la nueva barra de progreso.\r\n\r\nRetorno:\r\n\r\n`flet.ProgressBar`: Objeto de la barra de progreso reci\u00e9n creado.\r\n\r\n### `Controles.eliminar_control(self, id)`\r\nM\u00e9todo que elimina un control, ya sea un bot\u00f3n elevado o una barra de progreso, de la instancia de la clase Controles. El control a eliminar se identifica por su id.\r\n\r\nPar\u00e1metros:\r\n\r\n`id`: Identificador \u00fanico del control a eliminar.\r\n\r\nPara crear el instalador se debe llamar a la clase `Regalo` y como argumentos debe recibir el nombre de tu aplicaci\u00f3n, el path del archivo `.exe`, las p\u00e1ginas que representa las etapas de la instalaci\u00f3n como una p\u00e1gina individual de flet:\r\n\r\n## P\u00e1ginas\r\nLas p\u00e1ginas o etapas son los pasos de instalaci\u00f3n que se muestran al instalar un programa, estas p\u00e1ginas se pueden configurar, puedes a\u00f1adir, quitar o modificar, todo esto con ayuda de `flet`. Si no conoces, no dominas o la pereza te controla puedes usar las funciones predeterminadas.\r\n\r\n### Nota:\r\nTodas estas funciones predeterminadas retornan una tupla y estas funciones deben ser usadas dentro de otra funci\u00f3n que representar\u00e1 a la p\u00e1gina, ejemplo:\r\n\r\n```python\r\ndef main(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:\r\n componentes = funcion_predeterminada_regalo(*args)\r\n return componentes\r\n # se puede hacer directamente:\r\n # return funcion_predeterminada_regalo(*args)\r\n\r\npaginas = Paginas({'/inicio':main})\r\n```\r\n\r\n### `def terminos_condiciones(page, controles, titulo:str, file:TextIOWrapper, txt_aceptar:str, sig_ruta:str) -> tuple`\r\nGenera una interfaz para visualizar t\u00e9rminos y condiciones.\r\n\r\nPar\u00e1metros:\r\n\r\n- `page (Page)`: P\u00e1gina actual de la aplicaci\u00f3n.\r\n- `controles (Controles)`: Controles de la aplicaci\u00f3n.\r\n- `titulo (str)`: T\u00edtulo de la secci\u00f3n de t\u00e9rminos y condiciones.\r\n- `file (TextIOWrapper)`: Archivo de texto con los t\u00e9rminos y condiciones.\r\n- `txt_aceptar (str)`: Texto del checkbox de aceptaci\u00f3n.\r\n- `sig_ruta (str)`: Ruta a la siguiente secci\u00f3n en caso de aceptaci\u00f3n.\r\n\r\nRetorno:\r\n\r\n- `(tuple)`: Contiene la interfaz generada para la secci\u00f3n de t\u00e9rminos y condiciones.\r\n\r\n### `def config_instalacion(page, controles, varsInstal, titulo, text_seleccionar_carpeta, text_info, text_cambiar_ruta, text_expacio:str, sig_ruta:str) -> tuple`\r\n\r\nGenera una interfaz para la secci\u00f3n de instalaci\u00f3n.\r\n\r\nParameters:\r\n\r\n- `page (Page)`: P\u00e1gina actual de la aplicaci\u00f3n.\r\n- `controles (Controles)`: Controles de la aplicaci\u00f3n.\r\n- `varsInstal (InstallerVars)`: Variables relacionadas con la instalaci\u00f3n.\r\n- `titulo (str)`: T\u00edtulo de la secci\u00f3n de instalaci\u00f3n.\r\n- `text_seleccionar_carpeta (str)`: Texto para la selecci\u00f3n de carpeta.\r\n- `text_info (str)`: Informaci\u00f3n adicional.\r\n- `text_cambiar_ruta (str)`: Texto para cambiar la ruta de instalaci\u00f3n.\r\n- `text_expacio (str)`: Texto que muestra el espacio disponible.\r\n- `sig_ruta (str)`: Ruta a la siguiente secci\u00f3n.\r\n\r\nReturns:\r\n\r\n- `tuple`: Contiene la interfaz generada para la secci\u00f3n de instalaci\u00f3n.\r\n\r\n### `def config(page, controles, varsInstal, titulo, txt_btn_instalar:str, txt_checkbox_path, msg_agregar_path, variable_agregar_path, sig_ruta:str) -> tuple`\r\n\r\nGenera una interfaz para la configuraci\u00f3n antes de la instalaci\u00f3n.\r\n\r\nParameters:\r\n\r\n- `page (Page)`: P\u00e1gina actual de la aplicaci\u00f3n.\r\n- `controles (Controles)`: Controles de la aplicaci\u00f3n.\r\n- `varsInstal (InstallerVars)`: Variables relacionadas con la instalaci\u00f3n.\r\n- `titulo (str)`: T\u00edtulo de la secci\u00f3n de configuraci\u00f3n.\r\n- `txt_btn_instalar (str)`: Texto del bot\u00f3n de instalaci\u00f3n.\r\n- `txt_checkbox_path (str)`: Texto del checkbox de agregar al PATH.\r\n- `msg_agregar_path (str)`: Mensaje informativo sobre agregar al PATH.\r\n- `variable_agregar_path (str)`: Variable que indica si agregar al PATH.\r\n- `sig_ruta (str)`: Ruta a la siguiente secci\u00f3n.\r\n\r\nReturns:\r\n\r\n- `tuple`: Contiene la interfaz generada para la secci\u00f3n de configuraci\u00f3n.\r\n\r\n### `def instalacion(page, controles, id_btn_back, id_btn_install, pbRef:ft.Ref[ft.ProgressBar], msg_progreso) -> None`\r\n\r\nEsta funci\u00f3n no retorna una tupla. La funci\u00f3n de instalaci\u00f3n debe ser implementada por el usuario.\r\n\r\nParameters:\r\n- `page (Page)`: P\u00e1gina actual de la aplicaci\u00f3n.\r\n- `controles (Controles)`: Controles de la aplicaci\u00f3n.\r\n- `id_btn_back (str)`: Identificador del bot\u00f3n de retroceso.\r\n- `id_btn_install (str)`: Identificador del bot\u00f3n de instalaci\u00f3n.\r\n- `pbRef (ft.Ref[ft.ProgressBar])`: Referencia a la barra de progreso.\r\n- `msg_progreso (str)`: Mensaje de progreso de instalaci\u00f3n.\r\n\r\n- Ejemplo de implementaci\u00f3n:\r\n\r\n```python\r\ndef pag_instalar(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:\r\n pbRef = controles.get_control(\"pb\")\r\n\r\n instalacion(page, controles, varsInstal, \"back\", \"install\", pbRef, \"Instalando...\")\r\n\r\n # desactivamos la opcion de cancelar\r\n controles.cancel.current.visible = False\r\n # regalo es una instancia de la clase Regalo que proporciona la funci\u00f3n por defecto instalar_regalo\r\n # se le pasa la progressbar y la ruta donde se debe instalar el programa (hecho en pasos anteriores)\r\n regalo.instalar_regalo(pbRef.current, varsInstal.path_instalacion) \r\n # Se agrega el boton para cerrar el instalador\r\n controles.agregar_boton(\"fin\", \"Cerrar\", on_click=lambda _: page.window_destroy())\r\n # Se muestra un mensaje satisfactorio\r\n # Tambien se puede realizar una comprobaci\u00f3n para saber si fue todo correcto\r\n return (ft.Text(\"Instalaci\u00f3n finalizada\", size=18), ft.Text(\"El programa se ha instalado correctamente\", size=14))\r\n\r\npaginas = Paginas({'/instalacion': pag_instalar})\r\n```\r\n\r\n## Ejemplo de uso\r\n```python\r\nfrom Regalo import Regalo, Paginas, Controles, InstallerVars\r\nfrom Regalo import helpers\r\n\r\nfrom pathlib import Path\r\nfrom os import environ\r\n\r\nimport flet as ft\r\nfrom elevate import elevate\r\n\r\ndef main(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:\r\n txt_titulo_terminos = ft.Text(\"Terminos y condiciones\", size=18)\r\n terminos_condiciones = ft.Text(open(\"terminos_condiciones.txt\", \"r\").read(), size=14)\r\n controles.next.current.disabled = True\r\n \r\n contenido_term_cond = ft.Column(\r\n height=200,\r\n scroll=ft.ScrollMode.ALWAYS,\r\n controls=[\r\n ft.Container(\r\n terminos_condiciones,\r\n alignment=ft.alignment.top_left,\r\n )\r\n ],\r\n )\r\n\r\n def habilitar_next(e):\r\n btn_next.current.disabled = not btn_accept.value\r\n page.update()\r\n\r\n btn_accept = ft.Checkbox(label=\"Acepto los terminos y condiciones\", on_change=habilitar_next)\r\n btn_next = controles.next\r\n btn_next.current.on_click = lambda _: page.go(\"/pathInstall\")\r\n\r\n return (\r\n ft.Row([ txt_titulo_terminos ], alignment=ft.MainAxisAlignment.CENTER),\r\n ft.Container(contenido_term_cond, border=ft.border.all(1)),\r\n ft.Row([ btn_accept ])\r\n )\r\n\r\ndef pag_config_inst(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:\r\n if controles[\"install\"]:\r\n controles.install.current.visible = False\r\n controles.next.current.visible = True\r\n controles.next.current.disabled = False\r\n controles.next.current.on_click = lambda _: page.go(\"/config\")\r\n\r\n def select_file(e: ft.FilePickerResultEvent):\r\n filepicker.get_directory_path(\"Selecciona la carpeta...\")\r\n\r\n def return_path(e: ft.FilePickerResultEvent): \r\n if not e.path: return\r\n varsInstal.path_instalacion = e.path\r\n directory_path.value = e.path\r\n directory_path.update()\r\n \r\n directory_path = ft.Text(value=varsInstal.path_instalacion, expand=1)\r\n filepicker = ft.FilePicker(on_result=return_path)\r\n \r\n controles.appbar.title= ft.Text(\"Instalaci\u00f3n\")\r\n return (\r\n ft.Text(\"El prgrama se instalar\u00e1 en la siguiente carpeta\", size=16),\r\n ft.Text(\"Si desea seleccionar una carpeta, haga clic en el icono de la carpeta.\", size=14),\r\n ft.Container(\r\n content=ft.Row(\r\n [\r\n ft.IconButton(icon=ft.icons.FOLDER_OPEN, bgcolor=ft.colors.PURPLE_700, on_click=select_file),\r\n filepicker,\r\n directory_path\r\n ], \r\n alignment=ft.MainAxisAlignment.START,\r\n ),\r\n padding=10,\r\n height=140,\r\n alignment=ft.alignment.top_left\r\n ),\r\n ft.Row([\r\n ft.Text(f\"Se requiere al menos {helpers.get_format_size(varsInstal.path_instalador)} de espacio en disco\", size=15),\r\n ])\r\n )\r\n\r\ndef pag_config(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:\r\n controles.appbar.title = ft.Text(\"Configuraci\u00f3n\")\r\n\r\n controles.agregar_boton(\"install\", \"Install\", on_click=lambda _: page.go(\"/instalar\"))\r\n controles.next.current.visible = False\r\n\r\n def agregar_al_Path(e):\r\n if not agregar_path.value: return\r\n varsInstal[\"agregar_path\"] = True\r\n \r\n agregar_path = ft.Checkbox(label=\"Agregar al PATH\", on_change=agregar_al_Path)\r\n return (\r\n ft.Text(\"Desea agregar el comando ktw al path?\", size=18),\r\n agregar_path\r\n )\r\n\r\ndef pag_instalar(page: ft.Page, controles:Controles, varsInstal:InstallerVars) -> tuple:\r\n controles.appbarRef.current.visible = False\r\n controles.eliminar_control(\"back\")\r\n controles.eliminar_control(\"install\")\r\n \r\n pbRef = controles.get_control(\"pb\")\r\n page.views.append(\r\n ft.View(\r\n page.route,\r\n [\r\n controles.appbarRef.current,\r\n ft.Column([ft.Text(\"Instalando...\", size=15), ft.ProgressBar(ref=pbRef, width=500)]),\r\n ]\r\n )\r\n )\r\n \r\n page.update()\r\n controles.cancel.current.visible = False\r\n regalo.instalar_regalo(pbRef.current, varsInstal.path_instalacion)\r\n controles.agregar_boton(\"fin\", \"Cerrar\", on_click=lambda _: page.window_destroy())\r\n return (ft.Text(\"Instalaci\u00f3n finalizada\", size=18), ft.Text(\"El programa se ha instalado correctamente\", size=14))\r\n\r\ndef config(page:ft.Page, controles:Controles, varsInstal:InstallerVars):\r\n controles.appbarRef.current.bgcolor = ft.colors.BLUE_600\r\n\r\n page.vertical_alignment = ft.MainAxisAlignment.CENTER\r\n page.window_width = 550 \r\n page.window_height = 400\r\n page.window_resizable = False \r\n page.window_maximizable = False\r\n page.window_center()\r\n\r\n page.title = \"Ktw installer\"\r\n\r\npaginas = Paginas({'/pathInstall':pag_config_inst, '/config':pag_config, \"/instalar\":pag_instalar})\r\n\r\npath_ktw = Path(__file__).parent / \"app.exe\"\r\n\r\nvars_config = { \r\n \"path_instalacion\": Path(environ[\"USERPROFILE\"]) / \"KTW\",\r\n \"path_instalador\": path_ktw,\r\n \"agregar_path\": False,\r\n \"instalacion_terminada\": False,\r\n}\r\n\r\nif __name__ == \"__main__\":\r\n elevate(show_console=False)\r\n regalo = Regalo(\"ktw\", path_ktw, paginas, vars_config, func_config=config)\r\n regalo.abrir(main)\r\n```\r\n\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Creador de instaladores para windows",
"version": "0.4.2",
"project_urls": {
"Homepage": "https://github.com/nakato156/Regalo"
},
"split_keywords": [
"windows",
"installer",
"exe",
"executable",
"package"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "00461f7f7ebed6da91f6b9642ed2e8a4245ccb15f4c564c28766980afca99d6f",
"md5": "b36fcdbe354f9955e036f044e9a9ba3e",
"sha256": "e506bfa5e12ced8644f546fbc64c3da0c89097550b0b9afa23f7f96d0e122913"
},
"downloads": -1,
"filename": "Regalo-0.4.2.tar.gz",
"has_sig": false,
"md5_digest": "b36fcdbe354f9955e036f044e9a9ba3e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13733,
"upload_time": "2024-01-28T17:05:53",
"upload_time_iso_8601": "2024-01-28T17:05:53.178508Z",
"url": "https://files.pythonhosted.org/packages/00/46/1f7f7ebed6da91f6b9642ed2e8a4245ccb15f4c564c28766980afca99d6f/Regalo-0.4.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-28 17:05:53",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "nakato156",
"github_project": "Regalo",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "regalo"
}