На примере программы пинг-понг по стенкам демонстрируем работу функции after() из библиотеки Pyton tkinter. Функция after() (точнее, метод визуальных объектов) осуществляет отложенный вызов функции (с задержкой по времени).

fwdef

#! Python3
from tkinter import *

cnv = Canvas()
cnv.pack()

mainloop()

Лист. 1.

#! Python3
from tkinter import *

cnv = Canvas(width=800, height=600)
cnv.pack()

mainloop()

Лист. 2.

Рис. 1. Изображения шариков в png формате.

#! Python3
from tkinter import *

cnv = Canvas(width=800, height=600)
cnv.pack()
ball = PhotoImage(file='bronze.png')
cnv.create_image(0, 0, image=ball)

mainloop()

Лист. 3.

#! Python3
from tkinter import *

cnv = Canvas(width=800, height=600)
cnv.pack()
ball = PhotoImage(file='bronze.png')
cnv.create_image(250, 150, image=ball, anchor=CENTER)

mainloop()

Лист. 4.

Рис. 2.

Функция after()

hgd

#! Python3
from tkinter import *

def moveBall():
    cnv.move(1, 3, 2)
    cnv.after(10, moveBall)

cnv = Canvas(width=800, height=600)
cnv.pack()
ball = PhotoImage(file='bronze.png')
cnv.create_image(250, 150, image=ball, anchor=CENTER)

moveBall()
mainloop()

Лист. 5.

#! Python3
from tkinter import *
fps = 9                             # Время обновления в мСек
rBall=25                            # Радиус шарика
xSize = 800; ySize = 400            # Размер canvas
xv = 2; yv = 1                      # Скорость по х и у

def moveBall():
    global xv, yv
    cnv.move(1, xv, yv)
    cnv.after(10, moveBall)

cnv = Canvas(width=xSize, height=ySize)
cnv.pack()
ball = PhotoImage(file='bronze.png')
cnv.create_image(250, 150, image=ball, anchor=CENTER)

moveBall()
mainloop()

Лист. 6.

#! Python3
from tkinter import *
fps = 9                             # Время обновления в мСек
rBall=25                            # Радиус шарика
xSize = 800; ySize = 400            # Размер canvas
xv = 2; yv = 1                      # Скорость по х и у

def moveBall():
    global xv, yv
    xy = cnv.coords(1)
    if xy[0]+xv > xSize-rBall or xy[0]+xv < rBall:
        xv *= -1
    if xy[1]+yv > ySize-rBall or xy[1]+yv < rBall:
        yv *= -1
    cnv.move(1, xv, yv)
    cnv.after(10, moveBall)

cnv = Canvas(width=xSize, height=ySize)
cnv.pack()
ball = PhotoImage(file='bronze.png')
cnv.create_image(250, 150, image=ball, anchor=CENTER)

moveBall()
mainloop()

Лист. 7.

ООП

Программа листинг7 короткая и не сложная, но попробуйте с помощью функций создать запустить в полёт с различными параметрами десятки шариков. Задача сильно усложнится.

Создавать шарики на экране и управлять их полётом будет удобнее как абстрактными объектами.

Абстрагирование означает выделение значимой информации и исключение из рассмотрения незначимой. В объектно-ориентированном программировании рассматривают лишь абстракцию данных, нередко называя её просто абстракцией и подразумевая набор наиболее значимых характеристик объекта, доступных остальной программе. 

Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.

Так же, как и абстракция, с ООП неразрывно связано понятие инкапсуляция. Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. 

Класс — универсальный, комплексный тип данных, состоящий из тематически единого набора полей (переменных более простых типов) и методов (функций для работы с этими полями), то есть он является моделью информационной сущности с внутренним и внешним интерфейсами созданными для управления содержимым полей. 

Переменная-объект, относящаяся к заданному классом типу, называется экземпляром класса. 

Объект — сущность в адресном пространстве памяти вычислительной системы, появляющаяся при создании экземпляра класса.

c

#! Python3
from tkinter import *
from random import *

w=800
h=600
r=25

files = ['red.png', 'yellow.png', 'gold.png', 'green.png',
        'emerald.png', 'cyan.png', 'blue.png', 'pink.png',
        'azure.png', 'bronze.png', 'purple.png',
        'scarlet.png', 'steel.png', 'silver.png']

class Ball:
    def __init__(self, contain, img, x, y):
        self.obj = contain.create_image(x, y, image=img)

cnv = Canvas(width=w, height=h)
cnv.pack()
img = [PhotoImage(file=f) for f in files]

for i in range(15):
    [Ball(cnv, n, uniform(25, w-r), uniform(25, h-r)) for n in img]

mainloop()

Лист. 1.

Рис. 2.

#! Python3
from tkinter import *
from random import *

w=800
h=600
r=25

files = ['red.png', 'yellow.png', 'gold.png', 'green.png',
        'emerald.png', 'cyan.png', 'blue.png', 'pink.png',
        'azure.png', 'bronze.png', 'purple.png',
        'scarlet.png', 'steel.png', 'silver.png']

class Ball:
    def __init__(self, contain, img, x, y):
        self.obj = contain.create_image(x, y, image=img)
        self.c = contain
        self.move_ball()
    def move_ball(self):
        self.c.move(self.obj, 1, 1)
        self.c.after(10, self.move_ball)
        

cnv = Canvas(width=w, height=h)
cnv.pack()
img = [PhotoImage(file=f) for f in files]

for i in range(5):
    [Ball(cnv, n, uniform(25, w-r), uniform(25, h-r)) for n in img]

mainloop()

Лист. 1.

#! Python3
from tkinter import *
from random import *

w = 1400
h = 900
r = 50

files = ['red.png', 'yellow.png', 'gold.png', 'green.png',
        'emerald.png', 'cyan.png', 'blue.png', 'pink.png',
        'azure.png', 'bronze.png', 'purple.png',
        'scarlet.png', 'steel.png', 'silver.png']

class Ball:
    def __init__(self, contain, img, x, y):
        self.obj = contain.create_image(x, y, image=img)
        self.c = contain
        self.xv = uniform(1,7)
        self.yv = uniform(1,7)
        self.move_ball()
    def move_ball(self):
        self.xy = self.c.coords(self.obj)
        if self.xy[0] + self.xv > w-r or self.xy[0] + self.xv < r:
            self.xv *= -1
        if self.xy[1] + self.yv > h-r or self.xy[1] + self.yv < r:
            self.yv *= -1
        self.c.move(self.obj, self.xv, self.yv)
        self.c.after(25, self.move_ball)

cnv = Canvas(width=w, height=h)
cnv.pack()
img = [PhotoImage(file=f) for f in files]

for i in range(5):
    [Ball(cnv, n, uniform(25, w-r), uniform(25, h-r)) for n in img]

mainloop()

Лист. 1.

Рис. 1.

#! Python3
from tkinter import *
from random import *

w = 1400
h = 900
r = 25

files = ['red.png', 'yellow.png', 'gold.png', 'green.png',
        'emerald.png', 'cyan.png', 'blue.png', 'pink.png',
        'azure.png', 'bronze.png', 'purple.png',
        'scarlet.png', 'steel.png', 'silver.png']

class Ball:
    def __init__(self, contain, img, x, y):
        self.obj = contain.create_image(x, y, image=img)
        self.c = contain
        self.xv = int(uniform(-7,7))
        self.yv = int(uniform(-7,7))
        self.move_ball()
    def move_ball(self):
        xy = self.c.coords(self.obj)
        x = int(xy[0])
        y = int(xy[1])
        if x + self.xv > w-r or x + self.xv < r:
            self.xv *= -1
        if y + self.yv > h-r or y + self.yv < r:
            self.yv *= -1
        self.c.move(self.obj, self.xv, self.yv)
        self.c.after(25, self.move_ball)

def move_bsd(event):
    xm = event.x
    ym = event.y
    xy = cnv.coords(freebsd)
    x = int(xy[0])
    y = int(xy[1])
    cnv.move(freebsd, xm-x, ym -y)

cnv = Canvas(width=w, height=h)
cnv.pack()
img = [PhotoImage(file=f) for f in files]

for i in range(5):
    [Ball(cnv, n, uniform(r, w-r), uniform(r, h-r)) for n in img]

bsd = PhotoImage(file='FreeBSD.png')
freebsd = cnv.create_image(w/2, h/2, image=bsd)

cnv.bind('<Button-1>', move_bsd)

mainloop()

Лист. 1.

Рис. 2.