uk ru en pl cs sk bg de fr it ro hu tr ar id ja zh

Python 1. Las características dinámicas de implementación GUI en los widgets Tix: ScrolledWindow y NoteBook

A la principal Sobre el símbolo

Una de las ventajas del lenguaje de programación dinámico Python es la capacidad de crear dinámicamente una interfaz gráfica de usuario (GUI) en tiempo de ejecución. Biblioteca incorporada Tkinter le permite crear, colocar y mover una variedad de elementos gráficos para control, información de entrada y salida - widgets. Sin embargo, la biblioteca de Tkinter tiene una característica, si el número de widgets se hace más grande que permite mostrar la ventana con los tamaños máximos disponibles para la pantalla del monitor, hay un problema de acceso al área oculta de la ventana.

La extensión de la biblioteca incorporada Tkinter, la biblioteca Tix (Tk Interface Extension) puede resolver este problema con la ayuda del widget ScrolledWindow - una ventana con barras de desplazamiento. El segundo widget útil que viene con la biblioteca Tix es la ventana con pestañas - NoteBook.

Sin embargo, el uso de estos widgets en aplicaciones con ventanas en Python tiene sus propias peculiaridades de mostrar información en el caso de que los widgets internos no encajen en el tamaño de ventana asignado. En este artículo, examinaremos estas características al organizar una GUI dinámica:
El primer ejemplo es colocar el widget ScrolledWindow en la ventana principal de la aplicación y, por lo tanto, todos los demás widgets se colocarán automáticamente en él.
El segundo ejemplo es colocar los widgets ScrolledWindow sólo en las pestañas del widget NoteBook.

Los ejemplos presentados aquí se implementan en Python 2.7 y el sistema operativo Linux: Ubuntu 16.04LTS. Espero que la implementación de estos ejemplos en tu versión de Python y el sistema operativo no presenten ninguna complejidad para ti.


Ejemplo No.1 - widget ScrolledWindow como el contenedor principal de toda la aplicación.

#!/usr/bin/python

import Tix as tx

root=tx.Tk()
root.geometry("800x600+0+10")

swr=tx.ScrolledWindow(root)
swr.pack(fill=tx.BOTH, expand=1)

nb=tx.NoteBook(swr.window)
nb.pack(fill=tx.BOTH, expand=1)

for i in range(1,21):
	nb.add("tab"+str(i),label="Tab "+str(i))

for k in range(1,39):
	l=tx.Label(nb.tab1,text="label "+str(k))
	l.pack()

for k in range(1,29):
	l=tx.Label(nb.tab2,text="label "+str(k))
	l.pack(side=tx.LEFT)

root.mainloop()

El resultado del escenario No.1 puede verse en las tres cifras siguientes:


Figura 1

Vista inicial de la aplicación No.1 después del lanzamiento. Es visible la aparición automática de las barras de desplazamiento desde la derecha y en la parte inferior de la ventana principal. Dado que el tamaño total ocupado por el widget NoteBook es mayor que la ventana raíz original (800x600) debido al número de tabulaciones especificadas en el primer ciclo y el número de etiquetas especificado en los dos ciclos siguientes. Esta figura muestra que de las 20 pestañas especificadas, sólo 15 se colocaron en la ventana principal, y sólo 31 de las 39 etiquetas especificadas en la primera pestaña se encuentran.


Figura 2

La segunda pestaña en el estado inicial muestra sólo 16 etiquetas de 28. La posición de las barras de desplazamiento permanece sin cambios.


Figura 3

Mover la barra de desplazamiento inferior hacia la derecha puede ver que la ventana principal cubre no sólo todas las pestañas del widget de NoteBook sino también todas las etiquetas colocadas en la segunda pestaña.


Ejemplo No.2 - El widget ScrolledWindow se encuentra dentro de cada ficha del widget NoteBook.

#!/usr/bin/python

import Tix as tx

root=tx.Tk()
root.geometry("800x600+0+10")

swm = []

nb=tx.NoteBook(root)
nb.pack(fill=tx.BOTH, expand=1)

for i in range(1,21):
	nb.add("tab"+str(i),label="Tab "+str(i))
	sw=tx.ScrolledWindow(eval("nb.tab"+str(i)))
	swm.append(sw)
	sw.pack(fill=tx.BOTH, expand=1)

for k in range(1,39):
	l=tx.Label(swm[0].window,text="label "+str(k))
	l.pack()

for k in range(1,29):
	l=tx.Label(swm[1].window,text="label "+str(k))
	l.pack(side=tx.LEFT)

root.mainloop()

El resultado del escenario No.2 puede verse en las tres figuras siguientes:


Figura 4

La vista inicial de la aplicación No.2 después del lanzamiento. La barra de desplazamiento apareció sólo a la derecha en la ficha Tab1, ya que el número de marcas verticales es mayor que los tamaños originales de la ventana principal.


Figura 5

La segunda pestaña muestra sólo la barra de desplazamiento inferior, ya que en esta pestaña las etiquetas están colocadas horizontalmente.


Figura 6

Al mover la barra de desplazamiento hacia la derecha, puede ver todas las etiquetas al final de la ventana, pero no puede acceder a las pestañas con números mayores de 15. Por lo tanto, en la variante No.2, las barras de desplazamiento proporcionan acceso sólo dentro de la lengüeta. Si el número de pestañas es mayor que el que se coloca en el tamaño horizontal de la ventana principal, no habrá acceso a ellas.

Por lo tanto, si el número de pestañas del widget NoteBook no es demasiado grande para superar los límites de visualización de la ventana principal, entonces la variante considerada de la ubicación del widget ScrolledWindow es bastante aceptable.

Intentar unificar ambas variantes ha producido el mismo resultado que el ejemplo No.1, porque la ventana de widget de ScrolledWindow se expande a los tamaños máximos ocupados por objetos situados en él.

Espero que estos ejemplos le ayuden en el diseño de sus aplicaciones de ventana en Python.

Oleksii Tolkachov (ORCID ID: 0000-0002-4835-0507), Kiev, 30.08.2017.

A la principal Sobre el símbolo