Aprovechando que ya casi está terminado el curso de «Programación Interactiva en Python» de la plataforma Coursera, voy a hacer un recorrido por los proyectos acometidos que básicamente usan un widget capaz de dibujar en él. En el caso de la herramienta que proporcionan durante el curso (CodeSkulptor) dispone de una clase «simplegui» que han creado sus autores y que no es más que un wrapper del elemento Canvas de HTML5, con una interface Python. En realidad esto es lo más parecido al control DrawingArea de Gambas, y en esta serie de posts trataré de reproducir cada uno de estos proyectos usando como superficie de dibujo dicho control. Ciertamente existen otros componentes que están mejor enfocados al dibujo y la creación de juegos, como SDL y OpenGL, pero de momento nos vamos a centrar sólo en DrawingArea porque además tiene un gran potencial como base para crear otros controles gráficos.
Para colocar un control DrawingArea en nuestro formulario, accederemos a al panel de componentes situado en la parte inferior derecha del IDE de Gambas y arrastraremos el icono correspondiente a nuestro formulario:

Existe una propiedad del DrawingArea que es determinante a la hora de usar sus capacidades de dibujo y la forma de hacerlo. Se trata de la propiedad «Cached»:
Property Cached As BooleanDevuelve o establece si el contenido del DrawingArea se almacena en un objeto interno de tipo Picture.
Cuando se establece en True, el DrawingArea no borra su contenido cuando se tapa con otra ventana.
Solo se borra el contenido usando explícitamente el método Clear.
Bueno, este comportamiento no es el que a nosotros nos gustaría, aunque alguno se preguntará porqué… Vale, lo voy a explicar, pero eso se merece una cervecita, aunque si Granada te pilla lejos, podemos llegar a otro acuerdo.
Como se explica en la página oficial de Gambas, si ponemos la propiedad Cached = True, podremos dibujar sin miedo de que se nos borren nuestros dibujos al tapar el DA (en adelante llamaré así al DrawingArea para abreviar). Esto es realmente útil para dibujar mediante los métodos Paint y Draw, pero todas las llamadas a esos métodos los tendremos que encerrar entre otras dos llamadas (casi diría yo banderas) a los métodos Draw.Begin() y Draw.End(). Si intentamos dibujar fuera de esos dos métodos obtendremos un error. Igualmente si ponemos la propiedad Cached = False obtenemos un error que informa que no se puede dibujar fuera del evento Draw del DA. Probemos lo expuesto con este código:
Public Sub Form_open() DrawingArea1.Cached = True ' Cambiamos a False para comprobar Draw.Begin(DrawingArea1) Draw.LineWidth = 2 Draw.Circle(100, 100, 50) Draw.End() End |
Ahora cambiamos la propiedad Cached de True a False y vemos lo que pasa. Efectivamente esto aparte de generar un error tiene que servir para algo, ¿verdad?. Si os acordáis del título del post, esto va del evento Draw, que es aquél que se produce cuando es necesario[1] o tantas veces como nosotros queramos (por ejemplo 25 veces en un segundo, con la ayuda de un Timer), mediante el método .Refresh(). Eso ya es bastante, así que vamos a darle una utilidad práctica y a demostrar que este es el verdadero potencial del control DA y su evento Draw(). Pero eso será en el siguiente post, hasta pronto!
[1] «Cuando es necesario», esa es la explicación de Benoit Minisini. Realmente significa que se disparará el evento Draw siempre que el contenedor del DA cambie de tamaño, se tape o destape, etc.
Bien estaré atento a las publicaciones del blog y tus enseñanzas
Buen comienzo.