【问题标题】:When saving turtle graphics to an .eps file, the background color shows on the screen but is not saved in the .eps file将海龟图形保存到 .eps 文件时,背景颜色显示在屏幕上,但不保存在 .eps 文件中
【发布时间】:2016-04-17 20:19:23
【问题描述】:

我是 Python 新手,一直在使用 turtle 模块作为学习语言的一种方式。

感谢 stackoverflow,我研究并学习了如何将图像复制到封装的 postscript 文件中,并且效果很好。然而,有一个问题。 turtle 模块允许背景颜色显示在屏幕上,但不显示在 .eps 文件中。所有其他颜色,即笔颜色和乌龟颜色,都可以通过,但不能通过背景颜色。

出于兴趣,我不认为Tkinter 的导入是必要的,因为我不相信我在这里使用任何Tkinter 模块。我将它作为尝试诊断问题的一部分。我还使用了bgcolor=Orange 而不是s.bgcolor="orange"

没有喜悦。

我包含一个简单的代码示例:

# Python 2.7.3 on a Mac

import turtle
from Tkinter import *

s=turtle.Screen()
s.bgcolor("orange")

bob = turtle.Turtle()
bob.circle(250)

ts=bob.getscreen()
ts.getcanvas().postscript(file = "turtle.eps")

我尝试发布屏幕图像和.eps 文件,但作为新用户,stackoverflow 不允许我这样做。某种垃圾邮件预防。虽然很简单,但屏幕的背景颜色为橙色,eps 文件为白色。

我会很感激任何想法。

【问题讨论】:

  • 当它到达那个部分时我得到一个总线错误......嗯......
  • 如果你这样做会发生什么:ts.getcanvas().postscript(file = 'turtle.eps', colormode = 'color')?
  • 我试过了,添加了colormode = 'color',没有变化。此外,所有其他颜色,即笔和乌龟颜色都可以通过。似乎只有背景没有传输到 .eps 文件。

标签: python tkinter eps


【解决方案1】:

Postscript 设计用于在纸张或胶片等介质上制作标记,而不是光栅图形。因此,它本身没有可以设置为给定颜色的背景颜色,因为这通常是所使用的纸张或未曝光胶片的颜色。

为了模拟这个,你需要画一个画布大小的矩形,并用你想要的颜色填充它作为背景。我在 turtle 模块中没有看到任何查询 getcanvas() 返回的画布对象的内容,我能想到的唯一选择是读取 turtle.cfg 文件(如果有的话),或者只是硬编码默认的 300x400 大小。您也许可以查看源代码并找出当前画布尺寸的存储位置并直接访问它们。

更新:

我只是在 Python 控制台中使用 turtle 模块,发现画布 getcanvas() 返回的内容有一个名为 _canvas 的私有属性,即 <Tkinter.Canvas instance>。该对象具有winfo_width()winfo_height() 方法,它们似乎包含当前海龟图形窗口的尺寸。所以我会尝试画一个那个大小的填充矩形,看看它是否能满足你的需求。

更新 2:

这里的代码显示了如何执行我的建议。 注意:背景必须在任何其他图形之前绘制,否则创建的实心填充背景矩形将覆盖屏幕上的所有其他内容。

此外,添加的draw_background() 函数会努力保存图形状态并稍后将其恢复到原来的状态。根据您的具体使用情况,这可能不是必需的。

import turtle


def draw_background(a_turtle):
    """ Draw a background rectangle. """
    ts = a_turtle.getscreen()
    canvas = ts.getcanvas()
    height = ts.getcanvas()._canvas.winfo_height()
    width = ts.getcanvas()._canvas.winfo_width()

    turtleheading = a_turtle.heading()
    turtlespeed = a_turtle.speed()
    penposn = a_turtle.position()
    penstate = a_turtle.pen()

    a_turtle.penup()
    a_turtle.speed(0)  # fastest
    a_turtle.goto(-width/2-2, -height/2+3)
    a_turtle.fillcolor(turtle.Screen().bgcolor())
    a_turtle.begin_fill()
    a_turtle.setheading(0)
    a_turtle.forward(width)
    a_turtle.setheading(90)
    a_turtle.forward(height)
    a_turtle.setheading(180)
    a_turtle.forward(width)
    a_turtle.setheading(270)
    a_turtle.forward(height)
    a_turtle.end_fill()

    a_turtle.penup()
    a_turtle.setposition(*penposn)
    a_turtle.pen(penstate)
    a_turtle.setheading(turtleheading)
    a_turtle.speed(turtlespeed)

s = turtle.Screen()
s.bgcolor("orange")

bob = turtle.Turtle()
draw_background(bob)

ts = bob.getscreen()
canvas = ts.getcanvas()

bob.circle(250)

canvas.postscript(file="turtle.eps")

s.exitonclick()  # optional

这是实际产生的输出(通过 Photoshop 在屏幕上渲染):

【讨论】:

  • 底层的 Tk postscript 生成引擎不会为背景做任何事情,因为在生成 PS 的同时在下面放置一个矩形非常简单(您可以在之后再次删除它)。要使用的矩形的大小取决于您生成 PS 的目的;它仅默认为屏幕上可见的内容……
  • @DonalFellows:这种背景矩形的默认大小和颜色将是您自己的代码决定的,因为它不是自动创建的。我只是想建议一些东西作为尺寸的默认值。
  • 谢谢@martineau,你关于后记被设计为电影替代品的观点是有道理的。我将添加一个带有画布高度和宽度的大矩形。我不相信我必须直接使用 Tkinter 或 Tk。我相信实际变量将是 ts.window_width(),ts.window_height()。如果我让它工作,我会为后代发布新代码。
  • @New at Python:正确,有点——您应该能够使用标准的海龟图形命令绘制所需的背景矩形。然而,要检索高度和宽度信息将需要类似于ts.getcanvas()._canvas.winfo_width() 的内容,因此在真正意义上,您正在“使用”底层 Tkinter 对象的一部分。由于_canvas 以下划线开头,它是一个私有属性,理论上可能会在未来发生变化,因为它不是turtle 模块的记录部分。
  • @Bart:已修复。谢谢。
【解决方案2】:

我还没有找到在生成的(封装的)PostScript 文件上获取画布背景颜色的方法(我怀疑这是不可能的)。但是,您可以用颜色填充您的圆圈,然后按照@mgilson 的建议使用Canvas.postscript(colormode='color')

import turtle

bob = turtle.Turtle()
bob.fillcolor('orange')
bob.begin_fill()
bob.circle(250)
bob.begin_fill()

ts = bob.getscreen()
ts.getcanvas().postscript(file='turtle.eps', colormode='color')

【讨论】:

  • 感谢您的评论。如果我只是尝试添加填充颜色,这将解决问题。这个想法是让 bgcolor 变量通过。让我们拭目以待,看看是否有人有其他答案。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多