把一张图和一张用乌龟画的画结合起来

2024-03-29 06:49:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在绘制图形的画布上使用turtle模块绘制一些东西。你知道吗

我曾考虑过使用matplotlib来制作一个图形,但我需要稍后在该图形上用turtle绘制一些东西。我可以用海龟画图表和其他东西,但那要复杂得多。你知道吗

有人能想出更好的办法吗?你知道吗


Tags: 模块图形matplotlib画布图表绘制海龟turtle
1条回答
网友
1楼 · 发布于 2024-03-29 06:49:59

自从你问起,这个问题就一直萦绕在我的脑海里。我研究过各种方法,包括堆叠的看不见的画布,但没有运气。你知道吗

我最终决定尝试在幕后绘图,将绘图的图像保存到内存文件中,并将该图像加载到海龟背景中。通过为FigureCanvasTkAgg引入tkinter,它变得有点复杂,然后需要嵌入tkinter的turtle。但它是有效的。你知道吗

下面的代码使用matplotlib绘制一个正弦波,然后使用turtle在其上涂鸦Hilbert曲线。就因为我能:

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

相关问题 更多 >