Главная страница
Навигация по странице:

  • Глава Графика в Python11

  • Глава Графика в Python11 212 Рис.

  • Глава Графика в Python11 220Path = 5 degree = 45while degree > 28 : Path += 2 degree -= 0.2 left(degree) forward(Path) Рис.

  • Глава Графика в Python11 222...и задач

  • Глава Создание анимации12 224 Рис.

  • Шуман Х. - Python для детей - 2019. # Startwerte festlegen Red (255,0,0)


    Скачать 5.95 Mb.
    Название# Startwerte festlegen Red (255,0,0)
    Дата10.03.2023
    Размер5.95 Mb.
    Формат файлаpdf
    Имя файлаШуман Х. - Python для детей - 2019.pdf
    ТипДокументы
    #977830
    страница15 из 22
    1   ...   11   12   13   14   15   16   17   18   ...   22
    Глава
    Графика в 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("", mouseDraw)
    Так мы передаем событие функции mouseDraw().
    Теперь, когда мы взяли в оборот другое событие, пришло время рассказать про еще несколько событий в Python – в табл. 11.2.

    Глава
    Графика в Python
    11
    216
    Таблица 11.2. События в Python

    ,
    Нажата левая или правая кнопка мыши

    , Левая или правая кнопка мыши удерживается, мышь двигается

    Мышь двигается

    ,
    Указатель мыши находится в пределах компонента или вне

    ,
    Нажата клавиша
    Esc или нет

    Нажата ли какая-либо клавиша
    (клавиатуры)
    Конечно, есть еще много событий, почти для каждой клавиши на клавиатуре. Кроме того, они также используются для изменения состояния, размера и расположения компонента.
    Итак, здесь мы имеем событие, которое происходит, ког- да мышь перемещается при удерживаемой левой кнопке мыши. В соответствии с тем, что должно при этом прои- зойти, я назову новую функцию события mouseDraw().
    def mouseDraw(event):
    x = event.x - 1
    y = event.y - 1
    Graphic.create_oval( x, y, x+3, y+3)
    Функция принимает событие как параметр с событием.
    Внутри функции переменные x и y назначаются координа- тами указателя мыши. В этот момент рисуется очень ма- ленький круг, жирная точка.
    У нас уже есть полный исходный код. Поэтому введи следу- ющие строки и попытай удачу, например, написав свое имя
    (⇒ graphic7.py):
    # Рисование с помощью мыши from tkinter import *
    # Размеры окна
    Breadth = 500
    Highness = 330
    # Функция события def mouseDraw(event):
    x = event.x - 1
    y = event.y - 1

    Черепашья графика
    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("", mouseDraw)
    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.

    1   ...   11   12   13   14   15   16   17   18   ...   22


    написать администратору сайта