Saltar a contenido

Añadir la bola

El tercer paso de nuestra aplicación es añadir la bola. En principio la mostramos en el centro de la ventana:

03AñadirBola.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import tkinter

class Juego:
    def __init__(self, ventana):
        self.ventana = ventana

        # Configurar ventana
        self.ventana.title('Bola')
        self.ventana.resizable(False, False)
        self.ventana.wm_attributes('-topmost', True)

        # Crear lienzo
        self.lienzo = tkinter.Canvas(self.ventana,
                                     width=500,
                                     height=400,
                                     bd=0)
        self.lienzo.pack()
        self.ventana.update()

        # Crear bola
        self.bola = Bola(self)

        # Indicadores
        self.terminar = False

        # Asociar eventos de teclado
        self.ventana.bind_all('<KeyPress>', self.gestionar_tecla)

    def gestionar_tecla(self,evento):
        if evento.keysym=='Escape':
            self.terminar = True

    def bucle(self):
        while True:
            if self.terminar:
                break

            self.ventana.update_idletasks()
            self.ventana.update()

class Bola:
    def __init__(self, juego):
        self.juego  = juego

        tamaño = 15
        self.lienzo_ancho = self.juego.lienzo.winfo_width()
        self.lienzo_alto = self.juego.lienzo.winfo_height()

        self.juego.id_bola = self.juego.lienzo.create_oval(0, 0, tamaño, tamaño,
                                                           fill='red')
        centro_x = self.lienzo_ancho/2 - tamaño/2
        centro_y = self.lienzo_alto/2 - tamaño/2
        self.juego.lienzo.move(self.juego.id_bola, centro_x, centro_y)

v = tkinter.Tk()
juego = Juego(v)
juego.bucle()
juego.ventana.update_idletasks()
juego.ventana.destroy()

Definimos una clase Bola y la instanciamos, creando un objeto que guardamos como propiedad del juego. Véase que este ya tiene tres objetos gráficos, la ventana, el canvas y la bola.

Para instanciar la bola, le pasamos una referencia al objeto juego. Esto permite a los métodos de la clase Bola acceder a las propiedades del juego:

self.bola = Bola(self)

Dentro del método __init__() de la bola, guardamos la referencia:

def __init__(self, juego):
    self.juego  = juego

El juego tiene a su vez la propiedad lienzo, que nos permite descubrir las dimensiones de este y guardarlo entre las propiedades de la bola:

self.lienzo_ancho = self.juego.lienzo.winfo_width()
self.lienzo_alto = self.juego.lienzo.winfo_height()

Ahora que podemos acceder al lienzo desde la bola, dibujamos el círculo y guardamos una referencia al mismo:

self.juego.id_bola = self.juego.lienzo.create_oval(0, 0, tamaño, tamaño, fill='red')

... y lo desplazamos al centro del lienzo:

centro_x = self.lienzo_ancho/2 - tamaño/2
centro_y = self.lienzo_alto/2 - tamaño/2
self.juego.lienzo.move(self.juego.id_bola, centro_x, centro_y)

En futuros pasos, desplazaremos la bola por la pantalla usando el método bucle() del juego.