Программирование графики: рисуем в Python с помощью Canvas, Turtle и Matplotlib

Раздел: GUI -> Графика и GUI

Графический код на Python открывает широкие возможности для создания визуальных интерфейсов, анимаций, инструментов рисования и отображения данных. В этой статье рассмотрены основные библиотеки, позволяющие рисовать в окнах приложений, и приведены практические примеры с подробными пояснениями.

Основные подходы к созданию графического кода

Наиболее эффективное решение: Tkinter Canvas

Tkinter входит в стандартную поставку Python и предоставляет холст (Canvas) для рисования примитивов, изображений и текста. Canvas поддерживает события мыши, что позволяет создавать интерактивные приложения.


import tkinter as tk

root = tk.Tk()
root.title("Рисование на Canvas")
canvas = tk.Canvas(root, width=400, height=300, bg='white')
canvas.pack()

# Рисуем линию
canvas.create_line(10, 10, 200, 50, fill='blue', width=3)
# Прямоугольник
canvas.create_rectangle(50, 100, 150, 200, outline='red', fill='yellow')
# Овал
canvas.create_oval(200, 50, 300, 150, fill='green')
# Текст
canvas.create_text(200, 250, text="Привет, мир!", font=("Arial", 16))

root.mainloop()

графическая среда python (графическая среда разработки на python)

Пояснение: создаётся главное окно, на него помещается Canvas. Методы create_line, create_rectangle, create_oval, create_text принимают координаты и опции. Окно запускается вызовом mainloop().

Типичные ошибки и решения:

  • Ошибка: фигуры не отображаются. Решение: убедиться, что холст упакован (pack/grid) и размеры указаны корректно.
  • Ошибка: координаты заданы неправильно. Решение: проверить, что x1 < x2 и y1 < y2 для прямоугольников и овалов.
  • Проблема: очистка холста. Решение: использовать canvas.delete('all').

Как сделать анимацию движения объекта по экрану с помощью Turtle?

Модуль turtle ориентирован на обучение и позволяет управлять «черепашкой», рисуя линии и фигуры. Анимация реализуется циклическим обновлением позиции.


import turtle

screen = turtle.Screen()
screen.title("Анимация черепашки")
screen.bgcolor("lightblue")

t = turtle.Turtle()
t.speed(1)
t.shape("turtle")

def move_right():
    t.forward(10)

screen.onkey(move_right, "Right")
screen.listen()

turtle.done()

графический код python (графический код на python)

Пояснение: создаётся экран и черепашка. Событие нажатия клавиши «Right» вызывает движение вперёд. Для непрерывной анимации используется цикл с изменением угла и перемещением.

Типичные проблемы:

  • Ошибка: окно зависает при долгом цикле. Решение: использовать turtle.ontimer() для периодического вызова.
  • Ошибка: черепашка не поворачивается. Решение: вызывать t.left() или t.right().

Как реализовать интерактивное рисование с помощью мыши в PyQt5?

PyQt5 предоставляет мощный фреймворк с QGraphicsView и QPainter. Для рисования линий по движению мыши подписываются на события mouseMoveEvent.


import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel
from PyQt5.QtGui import QPainter, QPen, QImage
from PyQt5.QtCore import Qt, QPoint

class PaintWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Рисование в PyQt5")
        self.image = QImage(400, 300, QImage.Format_ARGB32)
        self.image.fill(Qt.white)
        self.last_point = QPoint()
        self.drawing = False

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = True
            self.last_point = event.pos()

    def mouseMoveEvent(self, event):
        if self.drawing:
            painter = QPainter(self.image)
            painter.setPen(QPen(Qt.black, 2))
            painter.drawLine(self.last_point, event.pos())
            self.last_point = event.pos()
            painter.end()
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(0, 0, self.image)

app = QApplication(sys.argv)
window = PaintWindow()
window.show()
sys.exit(app.exec_())

Python графические примитивы (рисование графических примитивов в python)

Пояснение: класс PaintWindow переопределяет методы мыши. В paintEvent рисуется сохранённое изображение. Важно хранить точки в self.last_point.

Типичные ошибки:

  • Ошибка: рисование происходит только при нажатии. Решение: проверить, что mouseMoveEvent вызывается без нажатия – включить setMouseTracking(True).
  • Ошибка: изображение не сохраняется. Решение: использовать self.image.save("drawing.png").

Как отобразить математический график в окне Tkinter с помощью встраивания Matplotlib?

Matplotlib можно встроить в Tkinter через FigureCanvasTkAgg. Это позволяет создавать интерактивные графики прямо в GUI.


import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import numpy as np

root = tk.Tk()
root.title("Встроенный график")

fig, ax = plt.subplots(figsize=(4, 3))
x = np.linspace(0, 2*np.pi, 100)
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.legend()

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack()

root.mainloop()

Пояснение: создаются фигура и оси, строится график. Canvas оборачивается в Tkinter-виджет. Метод draw() обновляет отображение.

Типичные ошибки:

  • Ошибка: график не отображается. Решение: установить библиотеку matplotlib и импортировать нужные модули.
  • Ошибка: окно зависает при перерисовке. Решение: не создавать новую фигуру каждый раз, а обновлять данные на существующей оси.

Расширенные примеры графического кода

1. Интерактивное рисование линий в Tkinter с отслеживанием мыши

Создаётся приложение, позволяющее рисовать произвольные линии при зажатой левой кнопке мыши. Сохраняется список точек для последующей отрисовки.

Пример

import tkinter as tk

class DrawingApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Рисовалка")
        self.canvas = tk.Canvas(root, width=500, height=400, bg='white')
        self.canvas.pack()
        self.canvas.bind("", self.start_draw)
        self.canvas.bind("", self.draw)
        self.last_x, self.last_y = None, None

    def start_draw(self, event):
        self.last_x, self.last_y = event.x, event.y

    def draw(self, event):
        if self.last_x and self.last_y:
            self.canvas.create_line(self.last_x, self.last_y, event.x, event.y,
                                    fill='black', width=2)
            self.last_x, self.last_y = event.x, event.y

root = tk.Tk()
app = DrawingApp(root)
root.mainloop()

Результат: при перемещении мыши с зажатой кнопкой на холсте появляются линии.

Открывается окно с белым холстом. При нажатии и движении мыши рисуется непрерывная линия.

2. Анимация черепашки: спираль с изменением цвета

Черепашка рисует спираль, постепенно увеличивая длину шага и меняя цвет пера.

Пример

import turtle

screen = turtle.Screen()
screen.bgcolor("black")

t = turtle.Turtle()
t.speed(0)
colors = ["red", "yellow", "blue", "green", "orange"]

for i in range(200):
    t.pencolor(colors[i % 5])
    t.forward(i * 0.2)
    t.left(59)

turtle.done()

Результат: на чёрном фоне рисуется разноцветная спираль.

Спираль из 200 витков, цвет меняется циклически.

3. График с возможностью масштабирования (matplotlib + Tkinter)

Встраивается интерактивный график, где можно приближать и отдалять участки.

Пример

import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import matplotlib.pyplot as plt
import numpy as np

root = tk.Tk()
root.title("Интерактивный график")

fig, ax = plt.subplots()
x = np.linspace(-2, 2, 400)
y = x**3 + x**2 - 1
ax.plot(x, y)
ax.set_title("Функция y = x^3 + x^2 - 1")

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()

canvas.get_tk_widget().pack()
root.mainloop()

Результат: окно с графиком и панелью инструментов (увеличение, перемещение).

Отображается график кубической параболы. Можно выбрать инструмент лупы на панели и растянуть прямоугольник для увеличения.

4. PyQt5: рисование прямоугольников по клику

При каждом клике левой кнопкой мыши на холсте появляется случайно окрашенный прямоугольник.

Пример

import sys, random
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import QRect

class RectanglesWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Случайные прямоугольники")
        self.setGeometry(100, 100, 500, 400)
        self.rects = []

    def mousePressEvent(self, event):
        x, y = event.x(), event.y()
        w, h = random.randint(10, 80), random.randint(10, 80)
        color = QColor(random.randint(0,255), random.randint(0,255), random.randint(0,255))
        self.rects.append((QRect(x, y, w, h), color))
        self.update()

    def paintEvent(self, event):
        painter = QPainter(self)
        for rect, color in self.rects:
            painter.setBrush(color)
            painter.drawRect(rect)

app = QApplication(sys.argv)
window = RectanglesWindow()
window.show()
sys.exit(app.exec_())

Результат: при каждом клике в точке курсора появляется прямоугольник случайного размера и цвета.

Окно с серым фоном. После 5-6 кликов видно разноцветные прямоугольники, нарисованные в местах нажатия.

Графический код на Python - comments

En
графический код python (python)