new Конспект 6. Модуль tkinter в python (часть 2 Игра ... · 2019. 11....
TRANSCRIPT
Конспект 6. Модуль Tkinter в Python (часть 2)
Игра «Поймай шарик»
Учитель информатики Батракова Л.В.
1
Сегодня мы должны создать игру «Поймай шарик». Для создания игры нам понадобятся дополнительные
методы модуля Tkinter. На прошлом занятии мы строили простые геометрические фигуры на Canvas,
сегодня мы познакомимся с некоторыми способами управления объектами Canvas. Так как
разрабатываемая игра связана с шариком, то основным объектом будет oval, который можно создать на
canvas методом create, например: Ovl = canvas.create_oval(x1,y1,x2,y2)
Движение шарика с помощью метода move()
Все графические методы возвращают идентификатор графической фигуры, который в последствии можно
использовать для:
удаления
сдвига,
изменения свойств
изменения формы.
Для этого предназначены методы – модификаторы.
Для удаления фигуры используется метод Canvas.delete(figure). Например, если прямоугольник
создан инструкцией: rect=cnvs.create_rectangle(20,50,100,100,fill="cyan"),
то удалить его можно командой Canvas.delete(rect). Удалить все нарисованные фигуры можно
командой Canvas.delete(ALL).
Для сдвига используется метод Canvas.move(figure, deltaX, deltaY), где figure –
идентификатор фигуры, deltaX, deltaY – смещения вдоль осей X и Y.
Для изменения свойств фигуры (цвета, толщины линии и т.д.) можно использовать метод
Canvas.itemconfig(figure[,опции]).
Для изменения координат «характеристических» точек фигуры - метод Canvas.coords(...) .
Пример, как можно организовать движение шарика при помощи метода Canvas.move():
Движение шарика реализовано в цикле for. Метод move()перемещает шарик по горизонтали на 5
пиксел. Метод sleep() приостанавливает выполнение на заданное количество секунд. Метод update()
– обновляет изображение на экране.
Задание 1.
Наберите текст программы и запустите программу. Модернизируйте программу, заставьте шарик двигаться
вперед и назад и покрасьте его в какой-нибудь цвет.
Движение шарика с помощью метода bind()
Для сообщения виджету (объекту) на какое событие, и как он должен реагировать, используется метод
bind. Формат оператора:
bind(event,имя_функции[, ”+”])
Где:
первый аргумент event – это строка специального содержания, обозначающая событие.
Конспект 6. Модуль Tkinter в Python (часть 2)
Игра «Поймай шарик»
Учитель информатики Батракова Л.В.
2
второй аргумент метода bind связывает событие с обработчиком, т.е. сообщает, какая функция
будет вызываться при обработке события.
третий необязательный аргумент – строка "+", которая означает, что обработчик события
добавляется к уже существующим. Если третий аргумент опущен или равен пустой строке, то указанный обработчик события замещает другие обработчики данного события.
В первом аргументе метода bind события записываются с помощью зарезервированных строк. Названия
событий заключаются в кавычки и в угловые скобки (знаки < и >). Вот обозначения для некоторых
событий, производимых мышью:
События, производимые мышью:
<Button-1> - щелчок левой кнопкой мыши
<Button-2> - щелчок средней кнопкой мыши
<Button-3> - щелчок правой кнопкой мыши
<Double-Button-1> - двойной клик левой кнопкой мыши
<Motion> - движение мыши и т. д.
Пример: from tkinter import *
def b1(event):
root.title("Левая кнопка мыши")
def b3(event):
root.title("Правая кнопка мыши")
def move(event):
root.title("Движение мышью")
root = Tk()
root.minsize(width = 500, height=400)
root.bind('<Button-1>',b1)
root.bind('<Button-3>',b3)
root.bind('<Motion>',move)
root.mainloop()
В этой программе меняется надпись в заголовке главного окна в зависимости от того двигается мышь, щелкают левой или правой кнопкой мыши.
События, производимые клавиатурой:
нажатие буквенных клавиш можно записывать без угловых скобок, например, 'P';
неалфавитные клавиши обозначаются специальными зарезервированными строками: “<Return>” –
нажатие клавиши Enter, “<space>” – пробел, “<Key>” – нажатие любой клавиши на клавиатуре и
т.д.
сочетания клавиш записываются через тире: “<Control-Shift>” (одновременное нажатие клавиш Ctrl
и Shift) и т.д. Например, если переменная root обозначает корневое окно, то участок кода, описывающий реакцию программы на комбинацию клавиш Ctrl – z может иметь следующий вид:
def prog_exit(event):
root.destroy()
. . .
root.bind('<Control-z>', prog_exit)
Конспект 6. Модуль Tkinter в Python (часть 2)
Игра «Поймай шарик»
Учитель информатики Батракова Л.В.
3
Нажатие комбинации клавиш Ctrl + z приведет к закрытию приложения.
Функция bind()может возвращать строки "continue" и "break", которые используются для
продолжения или прекращения обработки других привязок этого события. Если функция ничего не
возвращает (т.е. возвращает None), то обработка событий продолжается.
Функция обработчик события, подключаемая с использованием метода bind(), должна принимать один
аргумент – объект класса Event. Он имеет много различных атрибутов, которые здесь не
рассматриваются.
Таким образом, в tkinter с помощью метода bind() между собой связываются:
виджет,
событие
действие.
Например, виджет – кнопка, событие – клик по ней левой кнопкой мыши, действие – отправка сообщения.
Один и тот же виджет можно связать с несколькими событиями.
Пример1. Управление движением шарика при помощи клавиатуры:
Оператор root.bind('<Key>', moveoval)активируется при нажатии клавиш на клавиатуре
и вызывает функцию moveoval(event), которая обрабатывает событие нажатия.
Конспект 6. Модуль Tkinter в Python (часть 2)
Игра «Поймай шарик»
Учитель информатики Батракова Л.В.
4
Задание 2.
Наберите текст программы и запустите программу. Попробуйте управлять движением шарика при помощи
клавиш . Замените стрелки на цифры 6, 4, 8, 2. Посмотрите, что изменится.
Пример2. Появление шарика по щелчку мыши:
Оператор canv.bind('<Button-1>',paint) активируется по щелчку мыши и вызывает функцию
paint(event), которая рисует шары разного цвета и диаметра в том месте, где был щелчок мыши.
Задание 3.
Наберите текст программы и запустите программу. Что надо изменить в программе, чтобы получить рисунки, показанные ниже?
Делаем игру «Поймай шарик»
Суть игры проста: в случайном месте появляется на короткое время шарик и мы должны успеть щелкнуть
по нему мышкой.
Вначале создадим появляющиеся шарики: from tkinter import *
from random import randrange as rnd, choice
import time
root = Tk()
root.geometry('800x600')
canv = Canvas(root,bg='white')
canv.pack(fill=BOTH,expand=1)
colors = ['red','orange','yellow','green','blue']
def new_ball():
Конспект 6. Модуль Tkinter в Python (часть 2)
Игра «Поймай шарик»
Учитель информатики Батракова Л.В.
5
canv.delete(ALL)
x = rnd(100,700)
y = rnd(100,500)
r = rnd(30,50)
canv.create_oval(x-r,y-r,x+r,y+r,fill = choice(colors), width=0)
root.after(1000,new_ball)
new_ball()
mainloop()
Теперь добавим обработку щелчка мыши. Это функция click, которая вызывается командой: canv.bind('<Button-1>', click)
def click(event):
global points, x, text
if (event.y - y)**2 + (event.x - x)**2 <= r**2:
points += 1
x = -1000
canv.delete(text)
canv.delete(ball)
text = canv.create_text(20,20,text=str(points), font = 'Arial 20')
Где points – это переменная, в которой суммируются попадания попаданий в шарик.
Для определения попадания используется теорема Пифагора, с помощью которой можно найти расстояние
между двумя точками(x1,y1), (x2,y2) и сравнить его с радиусом круга.
Если расстояние (гипотенуза) больше радиуса, то щелчок произошел вне круга.
Конспект 6. Модуль Tkinter в Python (часть 2)
Игра «Поймай шарик»
Учитель информатики Батракова Л.В.
6
Если же расстояние меньше радиуса, значит щелкнули внутри круга.
Условие попадания: if (event.y - y)**2 + (event.x - x)**2 <= r**2:
points += 1
Полный текст программы:
from tkinter import *
from random import randrange as rnd, choice
import time
root = Tk()
root.geometry('800x600')
canv = Canvas(root,bg='white')
canv.pack(fill=BOTH,expand=1)
colors = ['red','orange','yellow','green','blue']
def new_ball():
global x,y,r,ball
canv.delete(ball)
x = rnd(100,700)
y = rnd(100,500)
r = rnd(30,50)
ball = canv.create_oval(x-r,y-r,x+r,y+r,fill = choice(colors), width=0)
root.after(1000,new_ball)
def click(event):
global points, x, text
if (event.y - y)**2 + (event.x - x)**2 <= r**2:
points += 1
x = -1000
canv.delete(text)
canv.delete(ball)
text = canv.create_text(20,20,text=str(points), font = 'Arial 20')
ball = canv.create_oval(-100,0,0,0)
text = canv.create_text(20,20,text=0, font = 'Arial 20')
points = 0
new_ball()
Конспект 6. Модуль Tkinter в Python (часть 2)
Игра «Поймай шарик»
Учитель информатики Батракова Л.В.
7
canv.bind('<Button-1>', click)
mainloop()
Постарайтесь разобраться в этой программе, наберите текст, запустите программу. Попробуйте ее модернизировать. Можно, например:
1. Добавить подсчет количества промахов.
2. Изменить подсчет очков, в зависимости от цвета или радиуса круга.
3. Изменить подсчет очков, в зависимости от точности попадания. Ближе к центру круга – больше очков.
Желаю удачи!!!
Используемая информация:
http://progras.ru/17-delaem-pervuyu-igru-na-python-pojmaj-sharik/ http://cs.mipt.ru/python/lessons/lab6.html https://www.russianlutheran.org/python/nardo/nardo.html