5

私はPythonを初めて使用し、言語を学習する方法としてturtleモジュールを使用しています。

stackoverflowのおかげで、画像をカプセル化されたポストスクリプトファイルにコピーする方法を調査して学びました。これは非常に効果的です。ただし、1つの問題があります。この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ファイルは白です。

.epsファイルから生成された出力

何かアイデアをいただければ幸いです。

4

2 に答える 2

3

Postscript was designed for making marks on some medium like paper or film, not raster graphics. As such it doesn't have a background color per se that can be set to given color because that would normally be the color of the paper or unexposed film being used.

In order to simulate this you need to draw a rectangle the size of the canvas and fill it with the color you want as the background. I didn't see anything in the turtle module to query the canvas object returned by getcanvas() and the only alternative I can think of is to read the turtle.cfg file if there is one, or just hardcode the default 300x400 size. You might be able to look at the source and figure out where the dimensions of the current canvas are stored and access them directly.

Update:

I was just playing around in the Python console with the turtle module and discovered that what the canvas getcanvas() returns has a private attribute called _canvas which is a <Tkinter.Canvas instance>. This object has winfo_width() and winfo_height() methods which seem to contain the dimensions of the current turtle graphics window. So I would try drawing a filled rectangle of that size and see if that gives you what you want.

Update 2:

Here's code showing how to do what I suggested. Note: The background must be drawn before any other graphics are because otherwise the solid filled background rectangle created will cover up everything else on the screen.

Also, the added draw_background() function makes an effort to save and later restore the graphics state to what it was. This may not be necessary depending on your exact usage case.

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

And here's the actual output produced (rendered onscreen via Photoshop):

output from eps file

于 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 に答える