5

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

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

作为一个有趣的问题,我不相信 import ofTkinter是必要的,因为我不相信我在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 文件为白色。

从 .eps 文件产生的输出

我会很感激任何想法。

4

2 回答 2

3

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 在屏幕上渲染):

eps文件的输出

于 2012-11-24T11:24:54.247 回答
1

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

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')
于 2012-11-24T02:18:34.303 回答