На примере программы пинг-понг по стенкам демонстрируем работу функции 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.