Объединить график с рисунком, сделанным с модулем черепаха - PullRequest
0 голосов
/ 09 июня 2019

Мне нужно что-то нарисовать, используя модуль черепахи на том же холсте, на котором будет построен график.

Я думал об использовании matplotlib для построения графика, но мне нужно позже нарисовать что-нибудь с черепахой на этом графике. Я мог бы нарисовать график и другие вещи с черепахой, но это намного сложнее.

Кто-нибудь может придумать лучший способ?

1 Ответ

0 голосов
/ 25 июня 2019

С тех пор, как вы задали этот вопрос, этот вопрос был у меня в голове.Я изучил различные подходы, включающие сложенные невидимые холсты, но не повезло.

Я наконец решил попробовать зарисовку за кулисами, сохранить изображение этого графика в файл памяти и загрузить это изображение на задний план черепахи.,Это немного усложняется введением tkinter для FigureCanvasTkAgg, который затем требует вложенную в tkinter черепаху.Но это работает.

Приведенный ниже код строит синусоидальную волну с помощью matplotlib, а затем использует черепаху для рисования граффити кривой Гильберта над ней.Только потому, что я могу:

import tkinter as tk
from io import BytesIO
from turtle import TurtleScreen, RawTurtle
from PIL import Image, ImageTk
import numpy as np

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

root = tk.Tk()

# Plot graph
figure = Figure(figsize=(5, 5))
subplot = figure.add_subplot(111)
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
subplot.plot(x, y)

# Make memory image of graph
invisible_figure_canvas = FigureCanvasTkAgg(figure, root)
buffer = BytesIO()
figure.savefig(buffer, format="png")
buffer.seek(0)

# Open memory as tkinter image
image = Image.open(buffer)
photoImage = ImageTk.PhotoImage(image)
buffer.close()

# Now do our turtle drawing embedded in tkinter
canvas = tk.Canvas(root, width=500, height=500)
canvas.pack()

screen = TurtleScreen(canvas)
screen._setbgpic(screen._bgpic, photoImage)  # bypass restrictions (protected access)

turtle = RawTurtle(screen, shape='turtle')
turtle.shapesize(0.5)

def hilbertCurve(n, angle):
    if n <= 0:
        return

    turtle.left(angle)
    hilbertCurve(n - 1, -angle)
    turtle.forward(10)
    turtle.right(angle)
    hilbertCurve(n - 1, angle)
    turtle.forward(10)
    hilbertCurve(n - 1, angle)
    turtle.right(angle)
    turtle.forward(10)
    hilbertCurve(n - 1, -angle)
    turtle.left(angle)

hilbertCurve(4, 90)

screen.mainloop()

enter image description here

...