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