Regalo


NameRegalo JSON
Version 0.4.2 PyPI version JSON
download
home_pagehttps://github.com/nakato156/Regalo
SummaryCreador de instaladores para windows
upload_time2024-01-28 17:05:53
maintainer
docs_urlNone
authorNakato
requires_python
licenseMIT
keywords windows installer exe executable package
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.17509s