martes, 21 de junio de 2022

Curso Guizero 3. Diseño y apariencia.

imagen de entrada al capitulo 3


Anteriormente. Capítulo 2: Widgets y Eventos.

Mejora el diseño de tu GUI colocando widget dentro de contenedores y cambiando su tamaño y alineación.

En este capitulo veremos un tipo especifico de widget llamado Box y aprenderemos como se puede usar para controlar el diseño de nuestra GUI.

¿Qué es un "Box"?

Un "Box" es un widget que actúa como contenedor para otros widgets. Por defecto es invisible y se puede utilizar para colocar más fácilmente otros widgets y modificar su diseño.

Se puede crear un "Box" de la misma manera que los otros widgets. El siguiente código crea un Box llamada "caja" que es parte de la App llamada "raiz":

from guizero import App, Box
raiz = App()
caja = Box(raiz)
raiz.display()

Cuando creas un "Box" puedes establecer varios parámetros iniciales.

  • master: describe donde esta contenida la caja o "Box". En el ejemplo anterior la caja esta contenida dentro de raíz.
  • align: se usa para alinear la caja dentro de widget en el que se sitúa. Veremos su uso más adelante aunque te adelanto que se usa el gestor de geometría pack por defecto en Guizero y funciona de forma automática como veremos más adelante.
  • grid: en el gestor de geometría Grid se usa para indicar donde aparecerá la caja dentro de una cuadricula o grid.
  • layout: este parámetro describe que gestor de geometría se va a utilizar 'grid' o 'auto' que corresponde con lo que en tkinter es el gestor de geometría pack.
  • visible: determina si el "Box" será visible, lo cual ocurre por defecto.
  • enabled: Este parámetro determina si la caja estará habilitada  Si no se establece entonces por defecto toma el mismo valor que tenga el parámetro del widget en el que se encuentra. En el ejemplo anterior el valor del parámetro para el elemento "raiz".
  • width y height: o ancho y alto. Determinan el tamaño de la caja. Se puede especificar el valor "fill" para que utilice todo el espacio disponible o especificar manualmente el ancho y/o el alto.
  • border: especifica el grosor del borde de la caja. El valor predeterminado es cero, es decir sin borde, pero se puede crear uno estableciendo su valor a "True" o un número mayor que 1.
Un Box o caja no es visible hasta que contiene otro widget. En el siguiente ejemplo vamos a ver como añadir un widget a un Box y que sucede cuando cambiamos algunos de estos parámetros.

Poner algo en la Caja.


Si queremos poner algo dentro de un Box, simplemente tenemos que poner el parámetro master de ese widget con el nombre que hayamos utilizado para crear el Box en cuestión. Siempre es el primer parámetro dentro de los paréntesis. En el siguiente ejemplo vamos a colocar un PushButton dentro de la caja:

from guizero import App, Box, PushButton
raiz = App()
caja = Box(raiz)
# insertamos un boton en la caja (Box)
boton = PushButton(caja)
raiz.display()


Se pueden alojar múltiples widgets en la misma caja. Intenta añadir otro PushButton o cualquier otro widget para ver los resultados.

Ahora crearemos un nuevo Box y cambiaremos algunos de los parámetros iniciales. Antes de ejecutar el siguiente código, intenta imaginar cómo se verá de distinta esta en relación con el código que usaste antes.

from guizero import App, Box, PushButton
raiz = App()
caja = Box(raiz, align="left", width="fill", border=2)
boton = PushButton(caja)
boton1 = PushButton(caja, text="Otro Botón")
raiz.display()


dos botones dentro de un Box


Como veremos, los widgets de Box son extremadamente útiles. Son útiles cuando se intentan diseños de GUI más sofisticados y se pueden usar para colocar varios widgets al mismo tiempo; Veremos esto en un paso posterior. También son útiles cuando se crean muchos widgets que deben tener el mismo aspecto, como veremos a continuación.

Desafio.

- Crea una aplicación que contenga tres cajas de diferentes tamaños.

- Cambia algunos parámetros iniciales más de tus cajas.

- Crea tres widgets más y coloca cada uno dentro de un cuadro diferente. ¿Puedes adivinar cómo se verá la aplicación antes de ejecutar tu script?

Puedes encontrar una posible solución al desafío en el siguiente enlace.


Mejorando la Apariencia 

Para comenzar a mejorar la apariencia de nuestras GUIs, veremos como cambiar propiedades de las mismas, como el fondo y el color de la fuente, la fuente en si misma y el tamaño del texto.

Vamos a utilizar este programa e intentaremos mejorar su apariencia:

from guizero import App, Text, ButtonGroup, Combo, PushButton, TextBox, Box
app = App(title="Generador nombres Heroes", width=300)

mensaje1 = Text(app, text="Escoje un adjetivo")
bgp_adjetivo = ButtonGroup(app, options=["Asombroso", "Hermoso", "Encantador", "Delicioso"], selected="Asombroso")

mensaje2 = Text(app, text="Escoje un color")
txt_color = TextBox(app)

mensaje3 = Text(app, text="Elige un animal")
cmb_animal = Combo(app, options=["Oso Hormiguero", "Tejón", "Gato", "Delfín", "Velociraptor"], selected="Oso Hormiguero", width=20)

btn_make_name = PushButton(app, text='Genera un nuevo superheroe')
lbl_output = Text(app, text="El nombre de tu heroe aparecerá aquí")

app.display()

Aunque aun no está completa vamos a intentar mejorar su apariencia.


Cambiando la apariencia de tu GUI.

Hay dos enfoques diferentes para cambiar la apariencia de una GUI. 

- Cambiar un parámetro de inicio.

- Cambiar una propiedad.


Cambio de Parámetros de inicio.

Cada vez que creamos un widget en Guizero, tenemos la posibilidad de establecer una serie de parámetros. Cada widget tiene diferentes parámetros de inicio. En la mayoría, se puede cambiar el color de fondo, el tamaño, el estilo del diseño, la posición y si el widget está activo o no. Para algunos, existen otros parámetros más específicos. Por ejemplo se puede cambiar el número de líneas que se mostrarán en un cuadro de texto y establecer el contenido del texto inicial.

Para averiguar que parámetros iniciales tiene un widget, puedes consultar la documentación. Si para programar estas utilizando un IDE, en muchos de ellos también, pero no en todos, puedes ver los parámetros de un widget escribiendo, por ejemplo app=App( y esperando que aparezca un menú de parámetros iniciales.


menu de opciones iniciales



Voy a cambiar el color de fondo de la aplicación a rojo modificando la línea tres del código


app = App(title="Generador Nombres Heroes", width=300, bg="red")

cambio del fondo a color rojo



Cambiar Propiedades.


Un método alternativo para modificar la apariencia de tus widgets es establecer propiedades después de que se haya creado el widget.

Por ejemplo, si deseas cambiar el color del texto en el mensaje 2, puede escribir

mensaje2.text_color = "blue"
Cambia el color del texto del widget mensaje2 a azul. Esta línea debe agregarse antes de la línea final del script, es decir antes de la línea app.display(), pero siempre después de que el widget haya sido creado.

Para conocer todas las propiedades que se pueden cambiar en cada tipo de widget puedes consultar la documentación.


El beneficio de usar cajas (Boxes)


Si quieres cambiar el color de fondo de cada widget en una aplicación, no tienes que repetir este código en cada uno. Si metes los widgets en un cuadro, puedes modificar las propiedades del mismo y esto se heredará a todos los widgets alojados en él. 

Pará ver esto vamos a colocar los últimos tres widgets del programa anterior dentro de un "Box" o Caja para lo cual añadiremos y modificaremos el código de la siguiente forma:

from guizero import App, Text, ButtonGroup, Combo, PushButton, TextBox, Box
app = App(title="Generador nombres Heroes", width=300, bg="red")

mensaje1 = Text(app, text="Escoje un adjetivo")
bgp_adjetivo = ButtonGroup(app, options=["Asombroso", "Hermoso", "Encantador", "Delicioso"], selected="Asombroso")

mensaje2 = Text(app, text="Escoje un color")
txt_color = TextBox(app)

mensaje3 = Text(app, text="Elige un animal")
cmb_animal = Combo(app, options=["Oso Hormiguero", "Tejón", "Gato", "Delfín", "Velociraptor"], selected="Oso Hormiguero", width=20)

#Creamos un box
caja = Box(app)

# modificamos cada widget de forma que estén alojados en la caja.
btn_make_name = PushButton(caja, text='Genera un nuevo superheroe')
lbl_output = Text(caja, text="El nombre de tu heroe aparecerá aquí")

# Ahora cambiamos las propiedades de la caja.
caja.bg = "white"
caja.text_size = 12

app.display()
Aunque hayamos insertado los dos últimos widgets en un Box, aún puedes cambiar sus propiedades individuales. Poe ejemplo es posible que quieras cambiar la fuente de texto de lbl_output.

lbl_output.font = "Times New Roman"
cambiando las propiedades de los widgets


Nota: Si quieres ver la forma de especificar diferentes colores para los widgets puedes enlazar a la siguiente página del manual. Te será muy útil. 

                    Siguiente Capitulo. 4.- Cambiando el tamaño de los Widgets y su alineación.




miércoles, 15 de junio de 2022

Curso Guizero 2.- Widgets y Eventos.



Anteriormente. Capítulo 1: Creando una interfaz gráfica de usuario.


Curso de Guizero 2.- Widgets y Eventos.

 Widgets

Ahora que hemos creado nuestra primera y sencilla aplicación GUI usando el widget Text, vamos a ver unos cuantos más que podamos usar.

¿Qué es un Widget?

La palabra "widget" hace referencia a cualquiera de los diferentes elementos que podemos utilizar para construir una interfaz para nuestra aplicación. Aunque no conozcamos aún sus nombres, reconocerás muchos de ellos ya que constantemente los estas viendo en los diferentes programas informáticos o páginas web que utilices.


Diferentes tipos de widgets


En el ejemplo superior se muestran siete tipos de widgets que podemos usar para construir el GUI. Los vamos a describir abajo, junto a una breve descripción de para que los podemos usar.


nombre en guizero nombre en tkinter  descripción
PushButton Button, command button Un botón que se puede pulsar y que sirve para múltiples propósitos. Junto con los cuadros y las etiquetas de texto son de los elementos más utilizados.
TextBox Entry Es una caja en la que se puede ingresar texto. Lo habrás utilizado en cualquier formulario de una página web para ingresar texto, por ejemplo.
Text Labels Las etiquetas de texto se utilizan para mostrar información al usuario. A diferencia de las cajas de texto, el texto no se puede editar.
ButtonGroup Radio button Se utilizan para escoger una opción entre un grupo de ellas. Por ejemplo en una página web se puede utilizar para escoger el pago de un bien con "tarjeta", "efectivo" o "transferencia para el pago". Es posible tener una opción preseleccionada por defecto.
CheckBox Checkbox Una sola casilla que se puede seleccionar y cuyo resultado será True, o False si no está marcada. En el ejemplo superior la opción de escojer entre algunos extras, utilizan el widget checkbox
ComboBox Combobox, drop-down menu Es como un cuadro de texto pero con un menú desplegable que permite al usuario elegir entre varias opciones.
Slider Es un widget que permite escoger un valor usando un control deslizandose a lo largo de una línea.

En este punto, ya hemos visto una descripción de los principales widgets que se pueden usar en una aplicación. También existen otros que se pueden utilizar como barras de menús o imágenes cuya documentación puedes consultar para tener una idea de lo que pueden hacer.


Eventos.


Explicación de los eventos y propiedades. 


Para dar vida a las aplicaciones basadas en un GUI, tenemos que escribir código para responder a los diferentes eventos que pueden suceder. Cada widget es capaz de "sentir" cosas diferentes que les suceden. Por ejemplo para un "PushButton", esto incluye hacer clic, hacer clic con el botón derecho y pasar el mouse sobre él. Los eventos son pues acciones que se realizan sobre el widget.

Así mismo también vimos un explicación breve de lo que son las propiedades. Las configuramos para el widget TexBox, en el capítulo uno, para controlar su color de fondo, el tamaño del texto o su fuente. Las propiedades también se pueden leer, lo que permite obtener valores del usuario, como el valor elegido en un Slider (control deslizante) o el nombre escrito en un TextBox (cuadro de texto).

Leer un valor de una propiedad de un widget es muy sencillo. Si por ejemplo tenemos un TextBox (cuadro de texto) llamado color_favorito en el que el usuario ha escrito la palabra "rosa" podemos guardar este valor en una variable de la siguiente forma usando una variable:

color = color_favorito.value

Para poder experimentar con los eventos y las propiedades, crea un nuevo programa en Python, guárdalo como "eventguide.py" y escribe el siguiente código:

# Importa los widgets que usaremos y creamos la aplicación de nuestro programa.
from guizero import App, TextBox, PushButton, Text, info
app = App()

# La definición de las funciones para los diferentes eventos van aquí.
def btn_go_clicked():
    info("Saludos","Hola, " + txt_name.value + " - Espero que tengas un buen día.")

# Los widgets de tu GUI van aquí.
lbl_name = Text(app, text="Hola. ¿Cómo te llamas?")
txt_name = TextBox(app)
btn_go = PushButton(app, command=btn_go_clicked, text="Hecho")

# Muestra la GUI en la pantalla.
app.display()

Lee el código e intenta imaginar lo que hace.

Ahora ejecuta el código, introduce tu nombre y haz clic en el botón que pone "Hecho".  ¿Hizo el programa lo que te habías imaginado que haría?

El programa, crea tres widgets:

- Una etiqueta de texto con el mensaje "Hola. ¿Cómo te llamas?"

- Un cuadro de texto donde podemos ingresar el nombre.

- Un botón con la etiqueta "Hecho" en el que se puede hacer clic.

aplicación Guizero

Cuando se hace clic en el botón "Hecho", se crea un evento y hay tres líneas de código que manejan el mismo. 

def btn_go_clicked() en la cual se describe que hacer si se pulsa el botón.

info("Saludos", "Hola, " + txt_name.value + " - Espero que tengas un buen día.") 

El código para mostrar una ventana de información cuando se ha pulsado el botón:

  • El primer parámetro "Saludos", es el título de la ventana.
  • El segundo parámetro es el texto que aparecerá dentro de la ventana de información. En este caso un texto de bienvenida que incluye el valor que haya en el cuadro de texto (txt_name.value)
btn_go = PushButton(app, command=btn_go_clicked, text="Hecho")

Cuando el widget PushButton se crea, incluimos command=btn_go_clicked para decirle a este botón, que cuando se pulse, la función btn_go_clicked debería ser ejecutada.

Cuando se ejecuta el programa, Python dibuja la GUI y luego espera a que se active un evento. Tan pronto como se hace clic en el botón (PushButton) se ejecuta el código en la función btn_go_clicked().

Nota. Al codificar una GUI es muy fácil confundirse entre variables, funciones y widgets. Para mejorar la legibilidad, el código incluye etiquetas como txt(texto), lbl (etiqueta) y btn (botón) para que los diferentes elementos que utilizamos puedan identificarse fácilmente.

Cuando escribas tu código, puedes llamar a tus variables y widgets como desees pero es mejor que uses una notación como la anteriormente indicada para que el código sea más fácil de depurar y corregir.

Un Desafio.

La mejor forma de aprender a crear GUIs interactivas es crearlas. Prueba a implementar algunos de estos elementos antes de continuar:

- Agrega dos widgets Text y TextBox para pedirle al usuario otra información (por ejemplo, el nombre de un animal). Cuando se haga clic en el PushButton, el cuadro emergente 'Info' debería mostrar esta nueva información (por ejemplo, 'Tu nombre es  MARIA y te gustan  los CACHORROS').

- Agrega un segundo botón (PushButton). Cuando el usuario haga clic en este botón, debería aparecer un mensaje diferente.

 - Crea una nueva aplicación que le pida al usuario que ingrese una contraseña dos veces y luego les diga si la ingresaron de la misma manera las dos veces.

Puedes hacer clic en el enlace para encontrar una posible solución.

Como te habrás dado cuenta, cuando creamos una aplicación basada en eventos, no sucederá nada después de que se cargue el programa hasta que se active un evento. 

Algunos ejemplos de eventos pueden ser:

- when_clicked Este ya lo hemos usado antes en el ejemplo.

- when_left_button_pressed Esto se puede usar junto con el próximo evento que explicaremos para hacer que los botones parezcan cambiar momentáneamente a medida que se hace clic en ellos.

- when_left_button_released Normalmente se usa junto al evento anterior.

- when_mouse_enters Se activa cuando el cursor del mouse ingresa a un widget. También se puede usar para proporcionar señales visuales a un usuario mientras navega por un GUI.

- when_mouse_leaves Se activa cuando el mouse abandona el widget. 

- when_mouse_dragged Se activa cuando se hace clic en con el mouse y se arrastra el widget.

Podemos configurar una función para que sea llamada por un evento asociado a un widget de la siguiente forma:

nombre_del_widget.when_left_button_pressed = nombre_de_la_función

Nota: a diferencia de cuando llamamos a una función dentro de un programa, en este punto debes asegurarte de poner el nombre de la función si los paréntesis de apertura y cierre al final. () Esto es debido a que estamos usando la función como parámetro y no llamándola directamente.

En el siguiente ejemplo, los eventos when_mouse_enters y when_mouse_leaves se usan para resaltar el cuadro de texto cuando el mouse está sobre él configurando su fondo en azul claro.

# Importa los widgets que usaremos y creamos la aplicación de nuestro programa.
from guizero import App, TextBox, PushButton, Text, info
app = App()

# La definición de las funciones para los diferentes eventos van aquí.
def btn_go_clicked():
    info("Saludos","Hola, " + txt_name.value + " - Espero que tengas un buen día.")

def highlight():
    txt_name.bg = "light blue"

def lowlight():
    txt_name.bg = None

# Los widgets de tu GUI van aquí.
lbl_name = Text(app, text="Hola. ¿Cómo te llamas?")
txt_name = TextBox(app)

# Cuando el cursor del ratón entra en el botón.
txt_name.when_mouse_enters = highlight

# cuando el cursor del ratón sale del botón.
txt_name.when_mouse_leaves = lowlight

btn_go = PushButton(app, command=btn_go_clicked, text="Hecho")

# Muestra la GUI en la pantalla.
app.display()




Una lista con todos los eventos disponibles la puedes encontrar en la página dedicada a Eventos en Guizero.

Desafio. 

Si quieres ver una aplicación completa en la que se utilizan todas estas herramientas y varios widget, puedes seguir el enlace a  la aplicación "El generador de nombres de superheroes" donde se utilizan muchos de estos eventos para generar el nombre ficticio de un superhéroe mediante la selección de varios datos y también puedes cambiar toda la aplicación al modo oscuro.

jueves, 9 de junio de 2022

Curso Guizero. 1.- Creando una Interfaz Gráfica de Usuario (GUI)


Imagen de entrada al capítulo

Creando una Interfaz Gráfica de Usuario (GUI)

Aunque anteriormente hemos visto ya como crear GUI´s con Tkinter y Guizero he pensado que quizá al mezclar ambos procesos el resultado haya sido confuso. Así que vamos a ver, en este y los siguientes capítulos como crear Aplicaciones Gráficas exclusivamente utilizando Guizero. 

Este curso esta basado en el curso de la Raspberry Pi Foundation "Programming with GUIs."

¿ Que necesitaremos ?

Python 3

Un IDE o editor de código. El que más te guste Mu, Thonny, Visual Studio Code etc

La librería en Python de Guizero.


Instalando Guizero.

Guizero se puede instalar en Windows, Mac y Linux. Aquí vamos a ver como instalarlo en Linux, aunque es igualmente sencillo instalarlo en cualquier otro sistema. Solamente tienes que ir a su página web y seguir las instrucciones.

Para instalarlo primeramente abrimos una sesión de terminal. Luego usamos el administrador de paquetes de Python3 y tecleamos:

sudo pip3 install guizero

Si quieres instalar características adicionales tales como poder utilizar archivos jpg, escalar imágenes o usar gifts animados entonces necesitarás instalar Guizero de forma similar al comando anterior pero usando:

sudo pip3 install guizero[images]

Si ha pasado algún tiempo y queremos actualizar el paquete, entonces usaremos la siguiente opción:

sudo pip3 install guizero --upgrade


Creando tu primer GUI.

Utiliza el editor de código que hayas elegido y crea un archivo vacío llamado por ejemplo "primer_gui.py". Después copia el siguiente código o mejor, tecléalo directamente: 

from guizero import App, Text
app = App(title="Esto es mi primera GUI")

message = Text(app, text="Esta GUI es estupenda.")
app.display()

Antes de ejecutar el código, simplemente por el contexto, imagina cual será el resultado. Es una buena práctica para ir descubriendo la lógica de la aplicación y verás como con el tiempo serás capaz de ir anticipando como se desarrollará el programa.

Bien, ejecuta el programa. Deberías ver algo como esto:

primera gui creada con Guizero

Echemos un vistazo al código línea por línea para ver que es lo que hace.

- from guizero import App, Text

Esta línea le dice a Python que importe los objetos App y Text desde la librería de Guizero.

- app = App(title="Esto es mi primera GUI")

Aquí estas creando un objeto de Guizero, App y estableces su propiedad title con el título de la ventana.

En el app, en minúsculas, es donde pondremos el resto de widgets o elementos que contendrá la aplicación. 

- message = Text(app, text="Esta GUI es estupenda.")

Estás creando un widget para mostrar etiquetas de texto (Text) llamado message. Y le estamos diciendo a Python que esa etiqueta de texto (Text) aparezca en la ventana de la aplicación (app) que definimos anteriormente. También configuramos su propiedad text para que contenga el texto "Esta GUI es estupenda".

- app.display()

Ahora que ya hemos codificado como debe ser la Interfaz del Usuario, este comando le dice al ordenador que muestre la aplicación (app) en pantalla.

Esta sencilla aplicación no hace nada más por el momento que mostrar una ventana con un texto por pantalla, pero en breve le añadiremos más funcionalidades.


Propiedades.

Si has trabajado antes con la programación orientada a objetos, ya conoces que los objetos pueden tener diferentes propiedades. Si no estas familiarizado con la programación orientada a objetos, no te preocupes, el realizar interfaces gráficas de usuario es una de las mejores formas de aprender.

Una propiedad es algo que ayuda a describir un objeto como por ejemplo la etiqueta Text. Esta etiqueta tiene propiedades como color, texto, una alineación (p.ej. izquierda, derecha, centro) y un montón de otras cosas que pueden personalizarse para crear el GUI que quieras.

Una vez que has creado un widget y le has dado un nombre (en el ejemplo anterior lo llamamos message) puedes usar el nombrewidget.property = nuevo_valor para cambiar su apariencia. Por ejemplo message.textsize = 40 cambia el tamaño del texto a 40.

Ahora, reemplaza todo tu código con el siguiente:

from guizero import App, Text
app = App(title="Una Ventana")

primer_mensaje = Text(app, text="Letras GRANDES")
segundo_mensaje = Text(app, text="Esto es verde")

primer_mensaje.text_size = 40
segundo_mensaje.bg = "green"

app.display()

Cuando ejecutes el código, verás que tienes dos Text Widgets y que el primero es más grande pero con menos colores que el segundo.


widget mostrando un texto y un el color verde

Al crear elementos o widgets en Guizero, recuerda que estos aparecen en el mismo orden en el que se crean.

Un Desafío.

- Intenta modificar el programa para añadir un tercer widget, usando el elemento Text, debajo de los otros dos 

- Para que el color del texto sea rojo en lugar de verde.

- Usa una fuente de letra diferente.

Puede hacer click en el enlace para ver una posible solución.

Un aspecto a mejorar al enfrentarnos a un nuevo programa es acostumbrarnos a leer la documentación del mismo. La documentación de Guizero describe como instalarlo y crear GUIs, además de proporcionar una referencia de cada uno de los widgets que podemos usar. Por ejemplo podemos mejorar la compresión sobre la etiqueta Text consultando su documentación.


En Resumen.

- Todos los programas de Guizero necesitan crear un objeto App al cual poder añadir los demás widgets.

- Los Widgets son elementos individuales que pueden usarse para construir un GUI, como los botones o etiquetas de texto.

- Los Widgets necesitan una app maestra a la que conectarse y aparecerán en la página en el orden en el que se crearon.

- Utilizando app.display() se mostrará el GUI.


Siguiente capítulo. Widgets y Eventos.

viernes, 3 de junio de 2022

¿Cómo usar elementos de Tkinter dentro de Guizero?

 


Uso de elementos de Tkinter dentro de Guizero.

En los ejemplos previos hemos visto como podemos usar widgets o cualquier elemento de Tkinter dentro de un programa de Guizero. Al fin y al cabo Guizero tiene su base en Tkinter con lo que podemos usar todos los widgets de este, dentro de Guizero.

Por ejemplo si creamos una caja de texto en Guizero (Textbox) pero queremos utilizar la propiedad wrap de Tkinter en ese objeto, porque por ejemplo Guizero no la contemplase, podemos asignar ese widget a un a variable y usar la propiedad tk del elemento que está detrás en tkinter (el widget entry). O quizá modificar también el tamaño de la ventana principal usando una propiedad de Tkinter y no la propia de Guizero.

Aunque Guizero es un paquete muy completo a veces no contempla determinados widgets o propiedades de los objetos, que si que están presentes en Tkinter. Por contrapartida es más sencillo de programar.

Lo anterior lo vemos mejor con este ejemplo:

from guizero import App, TextBox, PushButton, Text

def show():
    output.value = textbox.value

app = App()
app.tk.geometry("300x200")
textbox = TextBox(app, multiline=True, height=5, width=50, scrollbar=True, text="a multiline\ntextbox")
textbox.tk['wrap'] = 'word'
button = PushButton(app, text="Print", command=show)
output = Text(app)
app.display()

Aquí utilizamos la propiedad geometry() en app usando app.tk para cambiar el tamaño de la ventana. O textbox.tk[wrap] para cambiar la forma en la que el texto se presenta en la ventana. Esto último se utiliza para ajustar el contenido al ancho de un documento de texto.

Aprovecho para decir que "wrap" admite tres valores.

- none -> no ajusta el texto al ancho. El texto escrito sigue en la misma línea hasta que le des un intro.

- word -> Cuando llegamos al límite derecho del widget, pasa la  palabra entera a la siguiente línea.

- char -> Al llegar al limite derecho del contenedor, pasa el siguiente carácter a la siguiente línea.



Otro ejemplo. 

from guizero import App, Text
from tkinter import Message, HORIZONTAL, BOTH, TOP
from tkinter.ttk import Separator

app=App(title="My gui")
app.tk.geometry("300x200")

message=Text(app, text="A really long string that has too many characters to show up on one line within the default window size")
separador = Separator(app.tk, orient=HORIZONTAL)
separador.pack(side=TOP, fill=BOTH, expand=True,padx=5,pady=5)
msg2 = Message(app.tk, text="A really long string that has too many characters to show up on one line within the default window size")
msg2.pack()
app.display()

Aquí vamos a usar una caja de texto de Guizero para mostrar un texto realmente largo (message). 

Queremos utilizar un separador que es un elemento que si tiene Tkinter pero no esta implementado en Guizero. Lo insertamos al igual que haríamos en Tkinter, teniendo cuidado en definir que su ventana madre es app.tk y no app a secas. Y luego lo posicionamos en la ventana usando pack() de la forma habitual. 

Para terminar usamos el elemento Message de Tkinter para volver a mostrar ese mismo texto. Igual que antes definimos el elemento teniendo cuidado en especificar que su ventana madre es app.tk y luego lo empaquetamos normalmente usando pack().

El resultado:



Pero también hay otra forma de hacerlo. Para ello vamos a ver lo que nos dice el manual de Guizero.


Podemos agregar widgets tk a la aplicación usando el método add_tk_widget() que esta disponible para los elementos app, window y box.

Aquí podemos ver un ejemplo de su aplicación:

from guizero import App, Box, Text
from tkinter import Spinbox, ttk
from tkinter.ttk import Progressbar, Notebook

app = App(title="Using tk widgets")

Text(app, text="Spinbox")

# add a spinbox widget to the app
sp = Spinbox(from_=0, to=10)
app.add_tk_widget(sp)

Text(app, text="and Progressbar")

box = Box(app, border=True)

# add a progress bar to the box
pb = Progressbar(box.tk)
box.add_tk_widget(pb)
pb.start()

Text(app, text="in guizero")

box1 = Box(app, border=True)
nb = Notebook(box1.tk)
# create some frames for the tabs
signal_page_inputs = ttk.Frame(nb)
signal_page_outputs = ttk.Frame(nb)

# add the tabs
nb.add(signal_page_inputs, text='Signal Inputs')
nb.add(signal_page_outputs, text='Signal Outputs')

# important - add tk widget only after it is completed
box1.add_tk_widget(nb)

app.display()
La salida sería la siguiente:



Cuando agregamos un widget de Tkinter a una aplicación, ventana o caja de texto tenemos que especificar la propiedad tk (.tk) al crear el widget.

pb = Progressbar(box.tk)
box.add_tk_widget(pb)
pb.start()
La barra de progreso está dentro del contenedor "Box" así que para usarlo simplemente añadimos la barra de progreso al contenedor (box.add_tk_widget(pb)). 

Usando un método Tkinter en un objeto de Guizero.

Cada widget de Guizero en si mismo, como ya dijimos, es un objeto de Tkinter. Podemos averiguar a cual se corresponde buscando en la página de documentación de Guizero. Por ejemplo un objeto TextBox de Guizero se corresponde con el objeto Entry de Tkinter. Podemos acceder a ese elemento de Tkinter y sus propiedades por tanto usando .tk.

En este ejemplo, tenemos los widgets de Guizero, App y TextBox. Usamos el método config de Tkinter para cambiar el cursor del ratón cuando se sitúe encima del TextBox.

from guizero import App, TextBox app = App() name = TextBox(app, text="Laura") name.tk.config(cursor="target") app.display()





Puedes encontrar el código de los ejemplos en el siguiente enlace.