Index 📌
Index es una biblioteca de Python diseñada para facilitar la interacción con Google Sheets mediante las operaciones GET, UPDATE y BATCHUPDATE.

📌 Cómo Obtener las Credenciales para Google Sheets
Para utilizar esta biblioteca con Google Sheets, es necesario obtener credenciales de una cuenta de servicio en Google Cloud. Sigue estos pasos para configurarlas correctamente:

1️⃣ Crear un Proyecto en Google Cloud
Accede a la Consola de Google Cloud.
Crea un nuevo proyecto o selecciona uno existente.

2️⃣ Habilitar la API de Google Sheets
En la Consola de Google Cloud, ve a APIs y Servicios > Biblioteca.
Busca "Google Sheets API" y haz clic en Habilitar.

3️⃣ Crear una Cuenta de Servicio
Ve a APIs y Servicios > Credenciales.
Haz clic en Crear credenciales y selecciona Cuenta de servicio.
Asigna un nombre y una descripción a la cuenta de servicio.
En el apartado de Roles, selecciona Editor.
Haz clic en Continuar y luego en Listo.

4️⃣ Descargar el Archivo JSON de Credenciales
En la sección de Cuentas de servicio, selecciona la cuenta que creaste.
Ve a la pestaña Claves y haz clic en Añadir clave > Crear nueva clave.
Selecciona el formato JSON y descarga el archivo.
Guarda este archivo en un lugar seguro y añádelo a tu proyecto de Python.

5️⃣ Compartir el Google Sheet con la Cuenta de Servicio
Abre tu hoja de Google Sheets.
Haz clic en Compartir.
Copia el correo electrónico de la cuenta de servicio (se encuentra en la Consola de Google Cloud).
Pega el correo en la sección de compartir y otórgale permisos de Editor.


### 1. **`initialize_credentials(empresa)`**
   - **Propósito**: Inicializa las credenciales de Google Sheets usando un archivo JSON.
   - **Argumentos**:
     - `empresa`: Nombre de la empresa para buscar su archivo JSON de credenciales.
   - **Retorno**: Un servicio de Google Sheets o `None` si ocurre un error.
   - **Ejemplo**:
     ```python
     service = Index.initialize_credentials("mi_empresa")
     ```

### 2. **`get_data(service, archivo, hoja, rango=None)`**
   - **Propósito**: Obtiene datos de una hoja de cálculo de Google Sheets.
   - **Argumentos**:
     - `service`: Objeto de servicio de Google Sheets.
     - `archivo`: ID del archivo de Google Sheets.
     - `hoja`: Nombre de la hoja.
     - `rango`: Rango de celdas (opcional).
   - **Retorno**: Lista con los datos de la hoja.
   - **Ejemplo**:
     ```python
     data = Index.get_data(service, "archivo_id", "Hoja1", "A1:B10")
     ```

### 3. **`update_data(service, archivo, hoja, rango, valores)`**
   - **Propósito**: Actualiza un rango específico en Google Sheets.
   - **Argumentos**:
     - `service`: Objeto de servicio de Google Sheets.
     - `archivo`: ID del archivo.
     - `hoja`: Nombre de la hoja.
     - `rango`: Rango a actualizar.
     - `valores`: Nuevos valores para actualizar.
   - **Retorno**: Ninguno (actualiza los datos en Google Sheets).
   - **Ejemplo**:
     ```python
     Index.update_data(service, "archivo_id", "Hoja1", "A1", [["Nuevo valor"]])
     ```

### 4. **`update_data_locate(service, archivo, hojas, ubicaciones, valores)`**
   - **Propósito**: Actualiza varias celdas en varias hojas.
   - **Argumentos**:
     - `service`: Objeto de servicio de Google Sheets.
     - `archivo`: ID del archivo.
     - `hojas`: Lista de nombres de hojas.
     - `ubicaciones`: Lista de ubicaciones a actualizar.
     - `valores`: Valores a poner en las ubicaciones.
   - **Retorno**: Ninguno (actualiza las celdas en las hojas).
   - **Ejemplo**:
     ```python
     Index.update_data_locate(service, "archivo_id", ["Hoja1", "Hoja2"], ["A1", "B2"], [["Valor1"], ["Valor2"]])
     ```

### 5. **`get_index(data_cliente, columnas=None, filas=None)`**
   - **Propósito**: Obtiene un subconjunto de datos seleccionados por columnas y filas.
   - **Argumentos**:
     - `data_cliente`: Datos de la hoja.
     - `columnas`: Letras de columnas o rangos.
     - `filas`: Índices de filas.
   - **Retorno**: Subconjunto de datos.
   - **Ejemplo**:
     ```python
     data_subset = Index.get_index(data_cliente, columnas=["A", "B"], filas=[1, 2])
     ```

### 6. **`print_matriz(matriz)`**
   - **Propósito**: Imprime una matriz (lista de listas) en formato tabular.
   - **Argumentos**:
     - `matriz`: La matriz a imprimir.
   - **Retorno**: Ninguno (solo imprime).
   - **Ejemplo**:
     ```python
     Index.print_matriz([["A", "B"], ["C", "D"]])
     ```

A continuación, se presenta una nueva clase **`VentanaUsuario`** que permite crear una ventana interactiva donde el usuario puede elegir entre varias opciones representadas por botones. Cada botón está asociado a una función específica que se ejecutará cuando se presione el botón correspondiente.

#### **`VentanaUsuario`**: Clase para la Creación de Ventanas Interactivas

La clase `VentanaUsuario` permite crear ventanas donde el usuario puede elegir entre varias opciones (botones) que están asociadas a funciones específicas. Cada opción se presenta como un campo de entrada (`Entry`) en la interfaz gráfica. 

##### Ejemplo de Uso

El siguiente ejemplo muestra cómo crear una ventana con varias opciones, cada una con un campo de entrada. Al presionar un botón, el campo correspondiente será mostrado en la ventana.

```python

def opcion1(frame):
    #El manejo de lo que deseas con la libreria tkinter y customtkinter.
    pass

def opcion2(frame):
    #El manejo de lo que deseas con la libreria tkinter y customtkinter.
    pass

def opcion3(frame):
    #El manejo de lo que deseas con la libreria tkinter y customtkinter.
    pass

def opcion4(frame):
    #El manejo de lo que deseas con la libreria tkinter y customtkinter.
    pass

ventana_usuario = VentanaUsuario({
    "Ventana 1": (["Botón 1", "Botón 2"], [opcion1, opcion2]),
    "Ventana 2": (["Botón A", "Botón B"], [opcion3, opcion4]),
}).mostrar()
```

#### Explicación del Código:

1. **Definición de Opciones**: Cada opción está representada por una función, como `opcion1`, `opcion2`, `opcion3`, etc. Estas funciones se encargan de crear un campo de entrada (`Entry`) en la ventana de la interfaz gráfica.

2. **`VentanaUsuario`**: La clase `VentanaUsuario` recibe un diccionario donde las claves son los nombres de las ventanas y los valores son tuplas con dos elementos:
    - La primera lista dentro de la tupla contiene los nombres de los botones.
    - La segunda lista contiene las funciones asociadas a cada botón.
    
3. **`mostrar()`**: Esta función se encarga de crear la ventana y mostrarla con todos los botones. Cuando el usuario hace clic en un botón, se ejecuta la función asociada a ese botón, mostrando un campo de entrada correspondiente.

### ¿Cómo Funciona en Varias Ventanas?

La clase `VentanaUsuario` puede manejar múltiples ventanas con diferentes botones y opciones. Puedes definir tantas ventanas como necesites, cada una con sus botones y las funciones asociadas. Esto es útil cuando tienes múltiples formas de interacción con el usuario y deseas organizar las opciones de manera clara.

```python
ventana_usuario_1 = VentanaUsuario({
    "Ventana A": (["Botón X", "Botón Y"], [opcion1, opcion2]),
    "Ventana B": (["Botón P", "Botón Q"], [opcion3, opcion4]),
}).mostrar()

ventana_usuario_2 = VentanaUsuario({
    "Ventana C": (["Botón L", "Botón M"], [opcion1, opcion2]),
    "Ventana D": (["Botón N", "Botón O"], [opcion3, opcion4]),
}).mostrar()
```

En este ejemplo, se crean dos ventanas distintas con opciones separadas. Esto permite una mayor flexibilidad en la interacción del usuario con la interfaz gráfica.

---

### Consideraciones Finales

Al integrar estas clases en tu proyecto, asegúrate de que los datos que maneja la biblioteca sean consistentes y fáciles de utilizar por el usuario. Al implementar opciones dinámicas y accesibles, puedes proporcionar una experiencia más fluida al interactuar con hojas de cálculo de Google Sheets y otras funcionalidades que tu biblioteca ofrece.

¡Listo! Ahora puedes usar la biblioteca para interactuar con Google Sheets.