Skip to content

Creacion de un widget

Dev_ edited this page Jan 24, 2025 · 1 revision

Documentación detallada sobre la adición de widgets a la VirtualWindow

La VirtualWindow es una clase personalizada basada en CTkFrame (de CustomTkinter) que permite la gestión de widgets de manera dinámica, incluyendo agregar, mover, alinear, copiar, pegar y exportar la configuración de los widgets. A continuación, se describe paso a paso el proceso de cómo se agregan widgets a la VirtualWindow y las diferentes formas en que esto puede hacerse.


Métodos principales para agregar widgets

Existen tres formas principales de agregar widgets a la VirtualWindow:

  1. Agregar widgets programáticamente utilizando el método add_widget.
  2. Pegar widgets copiados con paste_widget.
  3. Importar widgets desde un código o archivo con import_from_codebox o import_from_file.

1. Agregar widgets con add_widget

El método add_widget es la forma más directa de agregar un widget a la VirtualWindow. Este método:

  1. Recibe el tipo de widget (widget_type) y sus argumentos opcionales (kwargs).
  2. Llama al método create_widget para crear una instancia del widget según su tipo.
  3. Si el widget es creado con éxito, utiliza _extracted_from_create_and_place_widget_5 para colocarlo en el centro de la ventana y hacerlo movible y seleccionable.

Pasos de ejecución:

  • Entrada:

    virtual_window.add_widget("CTkButton", text="Botón de prueba")
  • Proceso interno:

    • Llama a create_widget("CTkButton", text="Botón de prueba") para instanciar el widget.
    • Posiciona el widget en el centro de la ventana (x = ancho_ventana/2 - ancho_widget/2, y = altura_ventana/2 - altura_widget/2).
    • Configura el widget para que sea:
      • Movible: A través del método make_widget_movable.
      • Seleccionable: A través del método make_widget_selectable.
    • Agrega el widget a la lista interna self.widgets.
  • Resultado: El widget es visible en el centro de la VirtualWindow, es movible y seleccionable.


2. Pegar widgets con paste_widget

El método paste_widget permite reutilizar widgets copiados anteriormente en el portapapeles (self.clipboard).

Pasos de ejecución:

  • Entrada:

    • Copiar un widget con Control+C (o utilizando un método de copia).
    • Pegar el widget con paste_widget.
  • Proceso interno:

    • Llama a add_widget con el tipo y los parámetros del widget en el portapapeles.
    • El widget se coloca inicialmente en el centro de la ventana.
  • Resultado: Un duplicado del widget es colocado en la VirtualWindow.


3. Importar widgets desde código o archivo

Los métodos import_from_codebox e import_from_file permiten cargar widgets desde código Python o archivos previamente exportados.

Pasos de ejecución:

  1. Limpieza del estado previo:

    • Llama a clean_virtual_window para eliminar los widgets actuales.
    • Limpia guías y referencias de widgets.
  2. Parseo del código:

    • Analiza el código proporcionado con ast.parse.
    • Busca y extrae la clase App y la función generic_widget_creator.
  3. Creación y colocación:

    • Llama a process_widget_calls para procesar las llamadas de creación y colocación de widgets en el código.
    • Utiliza create_and_place_widget para instanciar cada widget y colocarlo en las posiciones especificadas en el código.
  • Resultado: Los widgets definidos en el código son creados y colocados en las posiciones indicadas.

Características adicionales al agregar widgets

  1. Movilidad:

    • Cada widget puede moverse dentro de la ventana utilizando el mouse.
    • El método make_widget_movable habilita eventos de arrastre (<Button-1> y <B1-Motion>).
  2. Selección:

    • Los widgets pueden seleccionarse con clic derecho.
    • make_widget_selectable habilita funcionalidades como:
      • Mostrar propiedades en la barra lateral.
      • Copiar (Control+C) y pegar (Control+V).
  3. Guías visuales:

    • Al mover un widget, se dibujan guías para facilitar su alineación con otros widgets.
    • Las guías son creadas por draw_guides y eliminadas por clear_guides.
  4. Exportación:

    • Los widgets creados pueden exportarse como código Python para ser reutilizados.
    • La exportación es manejada por export_to_file.

Código de referencia

A continuación, un ejemplo para agregar y personalizar un widget:

# Crear un botón en el centro de la VirtualWindow
virtual_window.add_widget("CTkButton", text="Click Me", fg_color="blue")

# Hacer que el botón sea movible y seleccionable
virtual_window.make_widget_movable(button)
virtual_window.make_widget_selectable(button)

# Exportar la configuración a un archivo
virtual_window.export_to_file("interfaz.py")