Saltar a contenido

Dibujar con tkinter

En este capítulo vamos a hacer algunos dibujos en un Canvas.

Dibujar línea

Una línea se dibuja con el método create_line(). se le pasan las coordenadas de ambos extremos

Linea.py
1
2
3
4
5
6
7
8
import tkinter as tk

ventana = tk.Tk()
lienzo= tk.Canvas(ventana, width=600, height=400)
lienzo.pack()

lienzo.create_line(10,10,550,390)
ventana.mainloop()

Lo que muestra:

Dibujar rectángulo

Un rectángulo se dibuja con el método create_rectangle(). Las coordenadas se refieren a la esquina superior izquierda y la inferior derecha:

Rectangulo.py
1
2
3
4
5
6
7
8
import tkinter as tk

ventana = tk.Tk()
lienzo= tk.Canvas(ventana, width=500, height=300)
lienzo.pack()

lienzo.create_rectangle(100,100,300,200)
ventana.mainloop()

Muestra:

Cuadros al azar

Vamos a dibujar 100 cuadros al azar:

El programa es:

Cuadros_azar.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import tkinter as tk
import random as r

ventana = tk.Tk()
ancho=1000
alto=600

lienzo= tk.Canvas(ventana, width=ancho, height=alto)
lienzo.pack()

for x in range(0,100):
    x1 = r.randrange(ancho)
    y1 = r.randrange(alto)

    ancho_max = ancho-x1
    alto_max = alto-y1

    x2 = x1 + r.randrange(0,ancho_max)
    y2 = y1 + r.randrange(0,alto_max)

    lienzo.create_rectangle(x1, y1, x2, y2)

ventana.mainloop()

Usamos un bucle for para recorrer una secuencia de 0 a 99. Las coordenadas x,y de cada cuadro se obtienen mediante una llamada a la función randrange(n) del módulo random. Esta función devuelve un valor entre 0 y n:

x1 = randrange(ancho)
y1 = randrange(alto)

El ancho y alto máximos del cuadro se calculan restando las coordenadas obtenidas de las dimensiones del Canvas:

ancho_max = ancho-x1
alto_max = alto-y1

Con otra llamada a radrange() se obtiene el ancho y alto del cuadro, lo que sumado a las coordenadas de la esquina superior, nos da las coordenadas de la inferior.

Rectángulo de color

Para rellenar un rectángulo con un color, usar el parámetro fill en la llamada a create_rectangle:

Rectangulo2.py
1
2
3
4
5
6
7
8
import tkinter as tk

ventana = tk.Tk()
lienzo= tk.Canvas(ventana, width=500, height=300)
lienzo.pack()

lienzo.create_rectangle(100,100,300,200, fill="#008080")
ventana.mainloop()

Color y grosor de línea

Al dibujar una línea, el color y grosor en pixels se determina mediante:

lienzo.create_line(10,10,500,300, fill="red", width=10)

Los valores por defecto son 'black' y 1

En los rectángulos, se usa fill para el color interior, outline para el color del marco, y width para su grosor:

lienzo.create_rectangle(100,100,300,200, fill="#008080", outline="red", width=5)

Arcos

Un arco es un fragmento de circunferencia u ovalo. Se crea con la función:

lienzo.create_arc()

Por ejemplo:

Arco.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import tkinter as tk

ventana = tk.Tk()
lienzo= tk.Canvas(ventana, width=1000, height=600)
lienzo.pack()

lienzo.create_arc(10,10,             # coordenadas esquina
                  500,300,           # ancho y alto
                  extent=90,         # grados del arco
                  start=45,          # punto de inicio
                  style=tk.PIESLICE, # tipo: ARC, CHORD, PIESLICE
                  width=5,           # grosor línea
                  outline='red',     # color línea
                  fill='green'       # color área
                  )

ventana.mainloop()

Muestra:

El ancho y alto se refiere al área ocupada por el ovalo completo. El dibujo se inicia a los 45 grados, y se va dibujando en sentido contrario a las agujas del reloj, completando 90 grados de arco.

El estilo puede ser:

  • ARC - dibuja solo la línea
  • PIESLICE - dibuja el area desde el centro del ovalo, como vemos en el ejemplo
  • CHORD - como PIESLICE, pero uniendo los dos extremos del arco con una línea recta:

Polígonos

Un polígono es una figura formada por n lados. Cada lado tiene dos coordenadas, la de inicio y la del final. El polígono se define por una secuencia de coordenadas.

Poligono.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import tkinter as tk

ventana = tk.Tk()
lienzo= tk.Canvas(ventana, width=600, height=400)
lienzo.pack()

lienzo.create_polygon(200,100,
                      80,150,
                      400,200,
                      400,320,
                      350,200,
                      140,200,
                      140,320,
                      120,200,
                      width=5,           # grosor línea
                      outline='red',     # color línea
                      fill='green'       # color área
                  )

ventana.mainloop()

Si la última coordenada no coincide con la primera, tkinter añadirá una coordenada adicional para completar la superficie: