将图表与使用 turtle 模块制作的绘图相结合
Combine a graph with a drawing made with turtle module
我需要使用 turtle 模块在绘制图形的同一个 canvas 上绘制一些东西。
我考虑过使用matplotlib 来制作图表,但我需要稍后在该图表上用turtle 绘制一些东西。我可以用 turtle 绘制图表和其他东西,但那要复杂得多。
谁能想到更好的办法?
自从你问起,这个问题就一直在我的脑海里。我研究了涉及堆叠隐形画布的各种方法,但没有成功。
我最终决定尝试在幕后绘图,将该绘图的图像保存到内存文件中,并将该图像加载到海龟背景中。通过为 FigureCanvasTkAgg
引入 tkinter 会变得有点复杂,然后需要一个 tkinter-embeded 乌龟。但它有效。
下面的代码使用 matplotlib 绘制正弦波,然后使用 turtle 在其上涂鸦希尔伯特曲线。只因为我可以:
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()
我需要使用 turtle 模块在绘制图形的同一个 canvas 上绘制一些东西。
我考虑过使用matplotlib 来制作图表,但我需要稍后在该图表上用turtle 绘制一些东西。我可以用 turtle 绘制图表和其他东西,但那要复杂得多。
谁能想到更好的办法?
自从你问起,这个问题就一直在我的脑海里。我研究了涉及堆叠隐形画布的各种方法,但没有成功。
我最终决定尝试在幕后绘图,将该绘图的图像保存到内存文件中,并将该图像加载到海龟背景中。通过为 FigureCanvasTkAgg
引入 tkinter 会变得有点复杂,然后需要一个 tkinter-embeded 乌龟。但它有效。
下面的代码使用 matplotlib 绘制正弦波,然后使用 turtle 在其上涂鸦希尔伯特曲线。只因为我可以:
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()