Python 将海龟图形保存到.eps文件时,背景色会显示在屏幕上,但不会保存在.eps文件中

Python 将海龟图形保存到.eps文件时,背景色会显示在屏幕上,但不会保存在.eps文件中,python,tkinter,eps,Python,Tkinter,Eps,我是Python新手,一直在使用turtle模块学习Python语言 多亏了stackoverflow,我研究并学习了如何将图像复制到封装的postscript文件中,效果非常好。然而,有一个问题。turtle模块允许背景颜色显示在屏幕上,但不显示在.eps文件中。所有其他颜色,即钢笔色和乌龟色,使其通过,但不是背景色 出于兴趣,我不认为有必要导入Tkinter,因为我不认为我在这里使用任何Tkinter模块。我把它作为诊断问题的一部分。我还使用了bgcolor=Orange而不是s.bgcol

我是Python新手,一直在使用turtle模块学习Python语言

多亏了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文件是白色的,非常简单,可以可视化


如果有任何想法,我将不胜感激。

我还没有找到在生成(封装)的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')

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

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

更新:

我刚刚在Python控制台中玩了
turtle
模块,发现canvas
getcanvas()
返回的有一个名为
\u canvas
的私有属性,它是一个
。此对象具有
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在屏幕上呈现):


当到达该部分时,我收到一个总线错误。。。嗯……如果这样做会发生什么:
ts.getcanvas().postscript(file='turtle.eps',colormode='color')
?我尝试了这个,添加了colormode='color',没有任何更改。此外,所有其他颜色(钢笔和乌龟的颜色)都可以通过。这似乎只是背景,没有转移到.eps文件。我感谢您的评论。如果我只是尝试添加填充颜色,这将解决问题。我们的想法是让bgcolor变量通过。让我们拭目以待,看看是否有人有其他答案。感谢您的帮助。底层Tk postscript生成引擎对背景没有任何作用,因为在生成PS时在其下方放置一个矩形非常简单(您可以直接删除它)。要使用的矩形的大小完全取决于生成PS的对象;它只默认为屏幕上可见的内容…@DonalFellows:这样一个背景矩形的默认大小和颜色将是您自己的代码决定的,因为它不是自动创建的。我只是想建议一些默认尺寸的东西。谢谢@martineau,你关于postscript被设计成电影替代品的观点是有道理的。我将添加一个带有画布高度和宽度的大矩形。我不认为我必须直接使用Tkinter或Tk。我相信实际的变量是ts.window\u width(),ts.window\u height()。如果我成功了,我将为后代发布新代码。@new at Python:Correct,sort--您应该能够使用标准的海龟图形命令绘制所需的背景矩形。但是,要检索高度和宽度信息,需要使用
ts.getcanvas().\u canvas.winfo\u width()
,因此在真正意义上,您是在“使用”底层Tkinter对象的一部分。由于
\u canvas
以下划线开头,因此它是一个私有属性,理论上将来可能会更改,因为它不是
海龟
模块的文档部分。@Bart:Fixed。谢谢