new Конспект 6. Модуль tkinter в python (часть 2 Игра ... · 2019. 11....

7
Конспект 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 это строка специального содержания, обозначающая событие.

Upload: others

Post on 03-Sep-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: New Конспект 6. Модуль Tkinter в Python (часть 2 Игра ... · 2019. 11. 15. · Конспект 6. Модуль Tkinter в Python (часть 2) Игра «Поймай

Конспект 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 – это строка специального содержания, обозначающая событие.

Page 2: New Конспект 6. Модуль Tkinter в Python (часть 2 Игра ... · 2019. 11. 15. · Конспект 6. Модуль Tkinter в Python (часть 2) Игра «Поймай

Конспект 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)

Page 3: New Конспект 6. Модуль Tkinter в Python (часть 2 Игра ... · 2019. 11. 15. · Конспект 6. Модуль Tkinter в Python (часть 2) Игра «Поймай

Конспект 6. Модуль Tkinter в Python (часть 2)

Игра «Поймай шарик»

Учитель информатики Батракова Л.В.

3

Нажатие комбинации клавиш Ctrl + z приведет к закрытию приложения.

Функция bind()может возвращать строки "continue" и "break", которые используются для

продолжения или прекращения обработки других привязок этого события. Если функция ничего не

возвращает (т.е. возвращает None), то обработка событий продолжается.

Функция обработчик события, подключаемая с использованием метода bind(), должна принимать один

аргумент – объект класса Event. Он имеет много различных атрибутов, которые здесь не

рассматриваются.

Таким образом, в tkinter с помощью метода bind() между собой связываются:

виджет,

событие

действие.

Например, виджет – кнопка, событие – клик по ней левой кнопкой мыши, действие – отправка сообщения.

Один и тот же виджет можно связать с несколькими событиями.

Пример1. Управление движением шарика при помощи клавиатуры:

Оператор root.bind('<Key>', moveoval)активируется при нажатии клавиш на клавиатуре

и вызывает функцию moveoval(event), которая обрабатывает событие нажатия.

Page 4: New Конспект 6. Модуль Tkinter в Python (часть 2 Игра ... · 2019. 11. 15. · Конспект 6. Модуль Tkinter в Python (часть 2) Игра «Поймай

Конспект 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():

Page 5: New Конспект 6. Модуль Tkinter в Python (часть 2 Игра ... · 2019. 11. 15. · Конспект 6. Модуль Tkinter в Python (часть 2) Игра «Поймай

Конспект 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) и сравнить его с радиусом круга.

Если расстояние (гипотенуза) больше радиуса, то щелчок произошел вне круга.

Page 6: New Конспект 6. Модуль Tkinter в Python (часть 2 Игра ... · 2019. 11. 15. · Конспект 6. Модуль Tkinter в Python (часть 2) Игра «Поймай

Конспект 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()

Page 7: New Конспект 6. Модуль Tkinter в Python (часть 2 Игра ... · 2019. 11. 15. · Конспект 6. Модуль Tkinter в Python (часть 2) Игра «Поймай

Конспект 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