Рисование и анимация с graphics.py в Python

Раздел: Прочее -> turtle

Введение в библиотеку Graphics для Python

Основное эффективное решение: работа с графикой через библиотеку graphics.py

Библиотека graphics.py (автор John Zelle) предоставляет простой способ создания окон, рисования фигур и обработки событий. Она часто используется в обучении благодаря интуитивному API. Для начала работы требуется установить библиотеку (или просто добавить файл graphics.py в проект).

# Установка через pip (если библиотека опубликована)
# В некоторых версиях Python требуется pip install graphics.py
# Или скачать файл graphics.py с официального репозитория и положить в папку проекта

import graphics as gr

Python turtle (python turtle (черепашка))

После импорта создаётся окно (объект GraphWin), в котором рисуются фигуры. Пример минимального окна с кругом:

from graphics import *

win = GraphWin('Моё окно', 400, 300)  # ширина 400, высота 300
circle = Circle(Point(200, 150), 50)   # центр (200,150), радиус 50
circle.setFill('blue')
circle.draw(win)

win.getMouse()  # ожидание клика перед закрытием
win.close()

Turtle program python (turtle графика в python)

Этот код создаёт окно с синим кругом по центру. Важно: после создания окна необходимо вызвать getMouse() или getKey(), иначе окно закроется сразу.

Цели использования: быстрый прототип графических программ, учебные проекты, простые анимации.

Как создать анимацию движения объекта?

Для анимации используется цикл, в котором изменяются координаты фигуры. После каждого изменения вызывается метод update() или sleep для контроля скорости.

from graphics import *
import time

win = GraphWin('Анимация', 500, 400)
ball = Circle(Point(50, 200), 20)
ball.setFill('red')
ball.draw(win)

dx = 2  # смещение по X
while True:
    ball.move(dx, 0)
    time.sleep(0.02)  # задержка в секундах
    # проверка выхода за границы и смена направления
    if ball.getCenter().x >= 480 or ball.getCenter().x <= 20:
        dx = -dx
    # закрытие окна по клику
    key = win.checkKey()
    if key == 'q' or win.isClosed():
        break

win.close()

библиотека рисования python (библиотеки для рисования в python)

Проблемы: бесконечный цикл может заблокировать программу. Решение – добавить проверку нажатия клавиши или закрытия окна. Также возможна проблема с зависанием окна из-за отсутствия обновления – в graphics.py метод move уже обновляет экран.

Как обработать клик мыши и получить координаты?

Метод getMouse() возвращает объект Point с координатами клика. Можно использовать в цикле для рисования фигур по клику.

from graphics import *

win = GraphWin('Клик для рисования', 400, 400)
win.setBackground('white')

while True:
    click_point = win.getMouse()  # программа ждёт клик
    # рисуем маленький круг в месте клика
    dot = Circle(click_point, 5)
    dot.setFill('green')
    dot.draw(win)
    
    # выход по клику правой кнопкой (не обрабатывается напрямую)
    # можно выйти по нажатию клавиши 'q'

win.close()

Python 3d models (3d модели в python)

Проблема: getMouse() блокирует выполнение до клика, что неудобно для анимации. Решение – использовать checkMouse() для неблокирующей проверки.

from graphics import *

win = GraphWin('Неблокирующий клик', 300, 300)
while True:
    pt = win.checkMouse()
    if pt:  # если клик был
        print('Клик в точке', pt.getX(), pt.getY())
    # ... остальной код анимации

библиотека graphics python (библиотека graphics в python)

Типичная ошибка – попытка использовать getMouse() в цикле с анимацией, что приводит к остановке программы до клика.

Как нарисовать текст в окне?

Объект Text рисует строку с заданным шрифтом и размером.

from graphics import *

win = GraphWin('Текст', 300, 200)
msg = Text(Point(150, 100), 'Привет, мир!')
msg.setSize(20)
msg.setTextColor('blue')
msg.draw(win)

win.getMouse()
win.close()

Qr кода python (qr-код на python)

Можно изменять текст методом setText(). Для ввода текста от пользователя используется Entry (поле ввода).

from graphics import *

win = GraphWin('Ввод текста', 300, 200)
inp = Entry(Point(150, 100), 15)
inp.draw(win)
win.getMouse()  # клик для завершения ввода
text = inp.getText()
print('Вы ввели:', text)
win.close()

Типичные проблемы и их решения

  • ImportError: No module named graphics – библиотека не установлена. Решение: установить через pip (pip install graphics.py) или скачать файл graphics.py и поместить в папку с проектом.
  • Окно не отображается или сразу закрывается – не вызван getMouse() или нет задержки. Решение: добавить getMouse() или бесконечный цикл с проверкой.
  • Ошибка при рисовании за пределами окна – координаты вне размеров окна. Решение: проверять границы перед рисованием.
  • Проблемы с производительностью анимации – слишком частые вызовы move без задержки. Решение: использовать sleep() или time.sleep() для контроля FPS.

Расширенные примеры использования библиотеки Graphics

Пример 1: Движущийся смайлик с изменением цвета

Пример
from graphics import *
import time

win = GraphWin('Смайлик', 400, 400)
win.setBackground('lightgray')

# Рисуем лицо
face = Circle(Point(200, 200), 100)
face.setFill('yellow')
face.draw(win)

# Глаза
left_eye = Circle(Point(170, 170), 10)
right_eye = Circle(Point(230, 170), 10)
left_eye.setFill('black')
right_eye.setFill('black')
left_eye.draw(win)
right_eye.draw(win)

# Рот (дуга)
mouth = Circle(Point(200, 220), 30)
mouth.setFill('red')
mouth.draw(win)

# Анимация: двигаем весь смайлик
dx, dy = 1, 0.5
while True:
    face.move(dx, dy)
    left_eye.move(dx, dy)
    right_eye.move(dx, dy)
    mouth.move(dx, dy)
    time.sleep(0.03)
    # проверка границ
    c = face.getCenter()
    if c.x <= 100 or c.x >= 300:
        dx = -dx
    if c.y <= 100 or c.y >= 300:
        dy = -dy
    # выход по клавише
    if win.checkKey() == 'q':
        break

win.close()
Окно с желтым смайликом, который движется по диагонали и отскакивает от краёв окна. При нажатии q программа завершается.

Пример 2: Рисование случайных многоугольников

Пример
from graphics import *
import random

win = GraphWin('Случайные многоугольники', 500, 500)
win.setBackground('white')

for _ in range(10):
    # генерируем 5 случайных точек
    points = []
    for _ in range(5):
        x = random.randint(50, 450)
        y = random.randint(50, 450)
        points.append(Point(x, y))
    poly = Polygon(points)
    # случайный цвет
    color = random.choice(['red', 'green', 'blue', 'yellow', 'purple', 'orange'])
    poly.setFill(color)
    poly.setOutline('black')
    poly.draw(win)
    
win.getMouse()
win.close()
В окне появляется 10 случайно расположенных пятиугольников с разными цветами заливки.

Пример 3: График функции y = sin(x) + 1

Пример
from graphics import *
import math

win = GraphWin('График синуса', 500, 300)
win.setBackground('white')

# оси координат
line_x = Line(Point(50, 150), Point(450, 150))
line_y = Line(Point(250, 20), Point(250, 280))
line_x.draw(win)
line_y.draw(win)

# масштаб: x от -2pi до 2pi, y от 0 до 2
# пиксели: центр в (250,150), масштаб по x: 200/(2pi), по y: 130/1
scale_x = 200 / (2 * math.pi)
scale_y = 130

prev_point = None
for px in range(50, 451):
    # переводим пиксель в координату функции
    x_val = (px - 250) / scale_x
    y_val = math.sin(x_val) + 1
    py = int(150 - (y_val - 1) * scale_y)  # y_val от 0 до 2
    cur_point = Point(px, py)
    if prev_point:
        line = Line(prev_point, cur_point)
        line.setFill('blue')
        line.draw(win)
    prev_point = cur_point

win.getMouse()
win.close()
Окно с синусоидой, построенной по точкам, с осями координат.

Пример 4: Интерактивное рисование линий по перетаскиванию мыши

Пример
from graphics import *

win = GraphWin('Рисование линий', 400, 400)
win.setBackground('white')

start_point = None
while True:
    pt = win.checkMouse()
    if pt:
        if start_point is None:
            start_point = pt
        else:
            # рисуем линию от предыдущей точки к новой
            line = Line(start_point, pt)
            line.setWidth(2)
            line.draw(win)
            start_point = pt  # продолжаем от новой точки
    # выход по клавише 'c' (clear) или 'q'
    key = win.checkKey()
    if key == 'c':
        # очищаем окно и сбрасываем начальную точку
        win.clear()
        start_point = None
    if key == 'q':
        break

win.close()
Пользователь кликает мышью, появляются линии между последовательными кликами. Нажатие 'c' очищает окно, 'q' завершает программу.

Библиотека Graphics в Python - comments

En
библиотека graphics python (python)