【问题标题】:Combine a graph with a drawing made with turtle module将图表与使用turtle模块制作的绘图结合起来
【发布时间】:2019-10-24 05:55:03
【问题描述】:

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

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

谁能想到更好的办法?

【问题讨论】:

    标签: python matplotlib drawing turtle-graphics


    【解决方案1】:

    既然你问了,这个问题就一直在我的脑海里。我研究了各种涉及堆叠隐形画布的方法,但没有运气。

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

    下面的代码使用 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()
    

    【讨论】:

    • 你好。由于某种原因,直到现在我才注意到你的回复。让你等了半年,我真觉得自己像个混蛋。感谢您的回复 - 它看起来非常独特,明天我会看看如何将代码实现到我的项目中。谢谢!
    • @ZadSar,没问题。你会惊讶于我从未收到过多少人的回音。希望对你有帮助。我在实现它时很开心,因为这不是关于实现 Space Invaders 的常见乌龟问题。
    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多