Шуман Х. - Python для детей - 2019. # Startwerte festlegen Red (255,0,0)
Скачать 5.95 Mb.
|
Глава Графика в Python 11 208 Добавим цвета Давай немного поэкспериментируем с методами Canvas, о которых вы узнали выше. Нам нужны цвета и помощь в их подборе. Подойдет код из предыдущей программы, нам лишь нужно изменить инструкции в функции события (⇒ graphic2.py): def buttonClick() : for Nr in range(0,84) : Dye = Color[random.randint(0,7)] Graphic.create_line(0, Nr*4, Breadth, Highness-Nr*4, fill=Dye) Graphic.create_line(Nr*6, 0, Breadth-Nr*6, Highness, fill=Dye) Дополнительный параметр fill гарантирует, что линия так- же имеет другой цвет, отличный от черного по умолчанию. Откуда берутся другие цвета? Для этого мне пришлось со- здать список цветов в tkinter: Color = ["gray", "black", "red", "green", \ "blue", "cyan", "yellow", "magenta"] Color – это набор цветов, из которого функция случайным образом выбирает один: Dye = Color[random.randint(0,7)] Конечно, модуль случайных чисел тоже должен быть им- портирован: import random Ниже приведена табл. 11.1 с наиболее подходящими цве- тами (от белого я отказался, потому что фон и так белый): Таблица 11.1. Константы цветов Константа Цвет Константа Цвет Константа Цвет black Черный cyan Голубой red Красный gray Серый magenta Пурпурный green Зеленый white Белый yellow Желтый blue Синий ¾ Отредактируй исходный код и запусти программу. На- жми кнопку Посмотрим! пару раз (ты также можешь изменить значения или формулы по своему усмот- Углы и круги 209 рению и посмотреть, что произойдет с линиями) (рис. 11.7). Рис. 11.7.Программа обрела цвет На большом экране все выглядит очень хорошо. Углы и круги Для следующей программы ты можешь смело использовать код предыдущей. Только функция события должна быть вновь изменена. Ниже показан измененный исходный код (⇒ graphic3.py): # Графика в Python from tkinter import * import random # Размеры окна Breadth = 500 Highness = 330 # Константы цвета Color = ["gray", "black", "red", "green", \ "blue", "cyan", "yellow", "magenta"] # Функция события Глава Графика в Python 11 210 def buttonClick() : for Nr in range(0,48) : Dye = Color[random.randint(0,7)] Graphic.create_rectangle(Nr*4, Nr*3, Breadth-Nr*4, \ Highness-Nr*3, fill=Dye) # Основная программа Window = Tk() Window.title("Графика") Window.config(width=Breadth, height=Highness) Graphic = Canvas(Window, width=Breadth, height=Highness) Graphic.pack() Button = Button(Window, text="Посмотреть!", command=buttonClick) Button.place(x=Breadth/2-60, y=Highness/2-15, width=120, height=30) Window.mainloop() Привожу снова полный листинг, чтобы ты не запутался, что изменилось. В программе создаются прямоугольники, и с каждой итерацией цикла for параметры и размеры из- меняются соответствующим образом (рис. 11.8). ¾ Чтобы понять, как работает программа, посмотри, что произойдет, если ты изменишь некоторые значения. Рис. 11.8.Вариант программы с прямоугольниками И сразу следующая версия программы, хотя ты не успел от- дохнуть. Опять же, здесь изменена только функция собы- тия (⇒ graphic3a.py): Углы и круги 211 # Функция события def buttonClick() : for Nr in range(0,48) : Dye = Color[random.randint(0,7)] Graphic.create_oval(Nr*4, Nr*3, Breadth-Nr*4, \ Highness-Nr*3, fill=Dye) ¾ Измени программу и запусти ее (нажми кнопку не- сколько раз) (рис. 11.9). Рис. 11.9.Вариант программы с овалами Благодаря следующей программе ты теперь знаешь, что Canvas поддерживает не только прямоугольники и круги, но и многоугольники (⇒ graphic4.py): def buttonClick() : Dye = Color[random.randint(0,7)] Point = [(20,Highness-20), (Breadth/2,20), (Breadth-20,Highness-20)] Graphic.create_polygon(Point, fill=Dye) Здесь точки сначала объединяются в список, а затем метод create_polygon() соединяет эти точки друг с другом прямы- ми линиями. В данном случае получается (цветной) тре- угольник (рис. 11.10). Глава Графика в Python 11 212 Рис. 11.10.Вариант программы с треугольником Эксперименты с текстом Объект класса Canvas может не только рисовать. Ты так- же можешь передать ему свои строки текста и попросить отобра зить их. Ранее мы всегда передавали наш текст опре- деленным компонентам, и они отображали его. И в самом окне отображается строка заголовка. С помощью Canvas можно поместить текст в любую область окна. Как это сде- лать, показано в следующей версии графической програм- мы (⇒ graphic5.py): # Функция события def buttonClick() : for Nr in range(0,32) : Dye = Color[random.randint(0,7)] Font = random.randint(10,30) Graphic.create_text(random.randint(0,Breadth), \ random.randint(0,Breadth), \ text="Привет!", fill=Dye, font=("Arial", Font)) create_text() – это имя метода, который содержит множест- во параметров. Я разбил их здесь на две строки (напоми- наю об обратной косой черте, которая разделяет слишком длинные строки). Звездное небо 213 Здесь не только цвет, но и размер шрифта устанавливает- ся случайным образом. Параметр font позволяет выбрать шрифт и кегль. ¾ Запусти эту версию графической программы (рис. 11.11). Рис. 11.11.Вариант программы с текстом Звездное небо Окунемся немного в романтику. Пусть звезды или что-то другое будет сверкать. Для этого мы должны установить черное фоновое небо. В этом случае объекту Graphic требу- ется другой параметр: Graphic = Canvas(Window, width=Breadth, height=Highness, background="black") Примечание. Вместо слова background также можно исполь- зовать краткое имя параметра – bg.) Кнопка не должна быть заслонять красочное зрелище, по- этому мы переместим ее к самому нижнему краю окна про- граммы. Теперь к функции события. Цикл for продолжает выпол- няться. Он генерирует 300 случайных значений для пе- ременных x, y и z 300 раз, которые влияют на положение Глава Графика в Python 11 214 и диа метр окружностей, создаваемых с помощью метода create_oval() . Поскольку фон черный, я заменю черный цвет на белый в списке цветов. Код изменился в нескольких местах, поэтому привожу его полностью (⇒ graphic6.py): # Графика в Python from tkinter import * import random # Константы цвета Color = ["white", "gray", "red", "green", \ "blue", "cyan", "yellow", "magenta"] # Функция события def buttonClick() : for Nr in range(0,300) : x = random.randint(0,Breadth) y = random.randint(0,Highness) z = random.randint(2,15) Dye = Color[random.randint(0,7)] Graphic.create_oval(x,y, x+z, y+z, fill=Dye) # Основная программа Window = Tk() Window.title("Графика") Breadth = 500 Highness = 330 Window.config(width=Breadth, height=Highness) Graphic = Canvas(Window, width=Breadth, height=Highness, \ background="black") Graphic.pack() Button = Button(Window, text="Посмотреть!", command=buttonClick) Button.place(x=Breadth/2-60, y=Highness-40, width=120, height=30) Window.mainloop() ¾ Внеси изменения в свою программу, затем запусти, и пусть звезды (или что-то еще) засверкают (рис. 11.12). Сам себе художник 215 Рис. 11.12.Программа с разноцветными звездами Сам себе художник Ранее tkinter использовал объект Canvas, чтобы нарисовать что-то в окне. Но почему бы не попробовать нечто другое? Итак, давай создадим программу, в которой ты сможешь рисовать мышью самостоятельно. Конечно, мы также по- зовем на помощь модуль Canvas. Сначала мы должны убе- диться (в основной программе), что существует связь меж- ду объектом Graphic и функцией события. Для этого мы ис- пользуем метод bind: Graphic.bind(" Так мы передаем событие Теперь, когда мы взяли в оборот другое событие, пришло время рассказать про еще несколько событий в Python – в табл. 11.2. Глава Графика в Python 11 216 Таблица 11.2. События в Python Черепашья графика 217 Graphic.create_oval( x, y, x+3, y+3) # Основная программа Window = Tk() Window.title("Графика") Window.config(width=Breadth, height=Highness) Graphic = Canvas(Window, width=Breadth, height=Highness) Graphic.bind(" Graphic.pack() Anzeige = Label(Window, text = "Рисование мышью") Anzeige.pack(side="bottom") Window.mainloop() Как видишь, я отказался от кнопки и заменил ее экранной подсказкой, чтобы сообщить тебе, что делать (рис. 11.13). Рис. 11.13.Рисование в программе с помощью мыши Черепашья графика Наконец, я добрался до чего-то совершенно иного, также связанного с графикой, но где библиотека tkinter не при- нимает участия. Давай посвятим время медлительному животному, которое может быть воплощено в жизнь на Py- thon. Глава Графика в Python 11 218 Нет, это не какое-то выдуманное существо, оно действи- тельно существует. Его не нужно кормить, но оно умеет даже рисовать, оставляя следы после себя. Посмотрим, как оно выглядит и двигается (⇒ turtle1.py): # Черепашья графика from turtle import * # Настройка окна Width, Height = 600, 400 Window = Screen() Window.title("Черепашка") Window.setup(width=Width, height=Height) # Рисование shape("turtle") for step in range(0,4) : forward(150) left(90) Можно было не настраивать окно, но я хотел бы сам вы- брать, насколько оно будет большое и как называться. С помощью функции Screen() создается объект окна, а с по- мощью метода setup() устанавливаются размеры. Новый модуль называется turtle. Его возможности основаны на tkinter . (Вот почему этот модуль интегрируется в модуль turtle с помощью команды import.) Уже при запуске окно открывается автоматически, но его размер задается системой. Фактически будущая фигура представляет собой квадрат: for step in range(0,4) : forward(150) left(90) Turtle (черепаха на русском языке) перемещается строго на 150 пикселей вперед, оставляя линию за собой, затем она поворачивается на 90° влево и проезжает еще 150 пиксе- лей. Это повторяется несколько раз, пока не будет нарисо- ван квадрат. Первоначальная позиция черепахи всегда находится в се- редине окна. И начальное направление указывает вверх. Это соответствует углу 0°. Черепашья графика 219 Если тебе интересно, где останавливается черепаха, добавь эту строку в начале: shape("turtle") Затем запусти программу еще раз (рис. 11.14). Рис. 11.14. Черепашка нарисовала квадрат Конечно, кроме методов forward() и left(), есть также back() и right(). Я думаю, ты догадался, что означают два других метода. С помощью метода home() ты перемещаешь чере- пашку обратно в центр окна. ¾ Проверь код программы и запусти ее. Если ты хочешь изменить исходный код, создай свои методы в про- грамме и попробуй реализовать то, что ты хочешь. Это работает следующим образом: если ты импортируешь модуль random, черепашка будет двигаться по случайной траектории (⇒ turtle2.py): for step in range(0,10) : forward(random.randint(10,100)) left(random.randint(60,90)) В принципе, рисование спирали – довольно простая в реа- лизации задача (⇒ turtle3.py) (рис. 11.15). Глава_Графика_в_Python11_222...и_задач'>Глава Графика в Python 11 220 Path = 5 degree = 45 while degree > 28 : Path += 2 degree -= 0.2 left(degree) forward(Path) Рис. 11.15.Черепашка нарисовала спираль Разумеется, есть возможность беспрепятственно переме- щать черепаху. Это может понадобиться, например, если ты хочешь начинать рисовать не от центра, а где-то из дру- гой позиции. Функция penup() «поднимает перо», и дальнейшее движе- ние становится невидимым. А функция pendown() «кладет перо» обратно на холст. С помощью функции goto() ты мо- жешь переместить черепашку в нужную позицию. Следующая программа сначала рисует прямоугольник, а затем круг в середине (⇒ turtle4.py): penup() goto(-245,150) pendown() for step in range(0,2) : forward(480) right(90) Несколько вопросов... 221 forward(290) right(90) # Circle penup() goto(-25,-140) pendown() circle(145) И это далеко не все методы, которые доступны. Если ты хочешь узнать больше, то сможешь найти информацию на сайте docs.python.org/3/library/turtle.html Подведение итогов Все было довольно красочно. И это была наиболее простая часть графических возможностей Python. Ты также узнал много новых методов модуля tkinter. Подведем итоги: Canvas Модуль реализует инструменты для создания графики create_line() Функция для рисования линий create_rectangle() Функция для рисования прямоугольников (квадратов) create_oval() Функция для рисования эллипсов (кругов) create_polygon() Функция для рисования (любых) многоугольников create_text() Функция для отображения текста (строк) bind() Связывает событие и функцию (напоминаю) Отвечает за движение мыши background=, bg= Задает цвет фона fill= Задает цвет контура или заливки font= Задает шрифт и его размер turtle Модуль для черепашьей графики forward(), back() Перемещает черепашку вперед/назад left(), right() Перемещает черепашку влево/вправо home(), goto() Перемещает черепашку в центр окна или в указанное положение penup(), pendown() Поднимает черепашку над холстом (рисует и не рисует соответственно) Несколько вопросов... 1. Где находится начало системы координат на экране? 2. Методы рисования линий, прямоугольников и эллипсов используют четыре параметра. Чем они отличаются? Глава Графика в Python 11 222 ...и задач 1. В предпоследней графической программе (со сверкаю- щими звездочками) замени их на маленькие точки. 2. В той же программе замени цветные точки квадратами. 3. Сможешь нарисовать домик? 4. Нарисуй спиральную паутину с помощью черепашки. 223 12 Создание анимации Твои достижения с графикой в последней главе были непло- хими. Но, может, будет лучше, если ты сможешь отобра зить в программе загруженный графический элемент? И чтобы у тебя была возможность перемещать такую фигуру. Это то, о чем мы сейчас и поговорим. Итак, в этой главе ты узнаешь: как использовать внешние графические файлы с по- мощью модуля Canvas; дополнительные приемы по работе с графикой; как заставить фигуру появляться на экране и двигаться; как создать собственный игровой модуль. Начнем с круга Начнем с простого графического объекта, круга. Он должен появляться после нажатия кнопки, а затем снова исчезать. Во-первых, нам нужно окно с тремя кнопками в нижней части экрана (рис. 12.1). Глава Создание анимации 12 224 Рис. 12.1.Базовое приложение для проекта Начнем с соответствующего исходного кода (⇒ movie0.py): # Анимация from tkinter import * # Размеры окна и текста Width = 500 Height = 330 Mode = ["Появление", "Движение", "Сокрытие"] # Функция события def showImage() : pass def moveImage() : pass def hideImage() : pass # Основная программа Window = Tk() Window.title("Анимация") Window.config(width=Width, height=Height) Graphic = Canvas(Window, width=Width, height=Height) Graphic.pack() Knob = [] for Nr in range(0,3) : Knob.append(Button(Window, text=Mode[Nr])) Начнем с круга 225 Knob[Nr].place(x=30+Nr*150, y=Height-50, width=140, height=30) Knob[0].config(command=showImage) Knob[1].config(command=moveImage) Knob[2].config(command=hideImage) Window.mainloop() Конечно, нам по-прежнему нужен объект, который мы смо- жем передвигать в окне. Для этого сначала возьмем прос- той круг. Его положение и размеры определены: x, y, z = 20, 50, 200 Здесь я наконец использую возможность (как упоминалось выше при согласовании размера окна) Python, касающую- ся создания сразу нескольких переменных и присваивания им значений. Функция showImage() выглядит следующим образом (⇒ movei1.py): def showImage() : global Circle Circle = Graphic.create_oval(x, y, x+z, y+z, fill="red") Тут я использую глобальную переменную Circle, которой присваивается возвращаемое значение метода create_ oval() . Таким образом, Circle является не объектом, а свое- го рода идентификационным номером. Это необходимо для двух других функций события. Теперь после нажатия кнопки круг должен перемещаться вправо. Следующий метод выглядит так (⇒ movei1.py): def moveImage() : global Circle for pos in range(20,Width-220,2) : Graphic.move(Circle, 2, 0) Graphic.update() Graphic.after(10) В цикле круг теперь перемещается постепенно слева напра- во. Используется метод move(), который принимает размер шага для горизонтального и вертикального перемещений в дополнение к переменной Circle. В примере перемеще- ние выполняется только слева направо, поэтому значение y равно 0. |