2012-11-24 7 views
5

Ich bin neu in Python und habe mit dem Turtle-Modul zum Erlernen der Sprache gearbeitet.Beim Speichern von Turtle-Grafiken in einer .eps-Datei wird die Hintergrundfarbe auf dem Bildschirm angezeigt, aber nicht in der .eps-Datei gespeichert.

Dank stackoverflow habe ich recherchiert und gelernt, wie man das Bild in eine gekapselte Postscript-Datei kopiert und es funktioniert super. Es gibt jedoch ein Problem. Das Modul turtle ermöglicht Hintergrundfarben, die auf dem Bildschirm angezeigt werden, aber nicht in der Datei .eps angezeigt werden. Alle anderen Farben, d. H. Stiftfarbe und Schildkrötenfarbe, machen es durch, aber nicht die Hintergrundfarbe.

Als eine Angelegenheit von Interesse, glaube ich nicht, dass der Import von Tkinter notwendig ist, da ich nicht glaube, dass ich irgendeinen der Tkinter Modul hier benutze. Ich habe es als Teil des Versuchs, das Problem zu diagnostizieren, aufgenommen. Ich hatte auch bgcolor=Orange anstelle der s.bgcolor="orange" verwendet.

Keine Freude.

Ich bin mit einem einfachen Code Beispiel:

# 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") 

Ich habe versucht, die Bilder auf dem Bildschirm und der .eps Datei zu schreiben, aber Stackoverflow erlaubt mir nicht, um einen neuen Benutzer zu tun. Eine Art Spam-Schutz. Einfach genug um zu visualisieren, hat der Bildschirm jedoch eine Hintergrundfarbe von Orange und die EPS-Datei ist weiß.

output produced from .eps file

würde ich irgendwelche Ideen zu schätzen wissen.

+0

ich einen Bus-Fehler, wenn es zu diesem Teil bekommt ... Hmmm ... – mgilson

+0

Was passiert, wenn Sie tun: 'ts.getcanvas(). postscript (file = 'turtle.eps', colormode = 'color')'? – mgilson

+0

Ich habe das versucht, indem ich den colormode = 'color' und keine Änderung hinzugefügt habe. Auch alle anderen Farben, also die Stifte und die Schildkrötenfarbe kommen durch. Es scheint nur der Hintergrund zu sein, der nicht in die .eps-Datei übertragen wird. –

Antwort

3

Postscript für die Herstellung von Markierungen auf einem anderen Medium wie Papier oder Film entwickelt wurde, nicht Rastergrafiken. Als solches hat es keine Hintergrundfarbe per se, die auf eine gegebene Farbe eingestellt werden kann, da dies normalerweise die Farbe des verwendeten Papiers oder des unbelichteten Films wäre.

Um dies zu simulieren, müssen Sie ein Rechteck von der Größe der Leinwand zeichnen und es mit der gewünschten Farbe als Hintergrund füllen. Ich habe im Turtle-Modul nichts gesehen, um das von getcanvas() zurückgegebene Canvas-Objekt abzufragen, und die einzige Alternative, die ich mir vorstellen kann, ist, die turtle.cfg-Datei zu lesen, wenn es eine gibt, oder einfach die Standardgröße von 300x400 fest zu codieren. Sie können möglicherweise die Quelle anzeigen und herausfinden, wo die Dimensionen der aktuellen Arbeitsfläche gespeichert sind, und direkt auf sie zugreifen.

Update:

ich gerade um in der Python-Konsole mit dem turtle Modul zu spielen und entdeckte, dass, was die Leinwand getcanvas() kehrt ein privates Attribut hat _canvas genannt, die ein <Tkinter.Canvas instance> ist. Dieses Objekt verfügt über winfo_width() und winfo_height() Methoden, die die Dimensionen des aktuellen Turtle-Grafikfensters zu enthalten scheinen. Also würde ich versuchen, ein gefülltes Rechteck dieser Größe zu zeichnen und zu sehen, ob es dir das gibt, was du willst.

Update 2:

zeigt hier Code, wie was zu tun ist, schlug ich. Hinweis: Der Hintergrund muss gezeichnet werden vor andere Grafiken sind, weil sonst das solide gefüllt Hintergrund Rechteck erstellt alles andere auf dem Bildschirm vertuschen.

Auch die hinzugefügte draw_background() Funktion geht zu einem beträchtlichen Aufwand zu speichern und später den Grafikzustand wiederherzustellen, was es war. Dies ist möglicherweise nicht abhängig von Ihrem genauen Anwendungsfall.

import turtle 
from Tkinter import * 

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 = bob.heading() 
    turtlespeed = bob.speed() 
    penposn = bob.position() 
    penstate = bob.pen() 

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

    bob.penup() 
    bob.setposition(*penposn) 
    bob.pen(penstate) 
    bob.setheading(turtleheading) 
    bob.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 

Und hier ist die tatsächliche Leistung erzeugt (Bildschirm via Photoshop gerendert):

output from eps file

+0

Die zugrundeliegende Tk Postscript Generierung Engine tut nichts für den Hintergrund mit der Begründung, dass das Einfügen eines Rechtecks ​​während der Generierung von PS ziemlich trivial ist (Sie können es direkt danach wieder löschen). Die Größe des zu verwendenden Rechtecks ​​hängt davon ab, für was genau PS generiert wird. es gibt nur _defaults_ zu dem, was auf dem Bildschirm sichtbar ist ... –

+0

@DonalFellows: Die Standardgröße und -farbe eines solchen Hintergrundrechtecks ​​ist, was auch immer Ihr eigener Code entscheidet, da es nicht automatisch erstellt wird. Ich versuche nur etwas als Standard für die Größe zu verwenden. – martineau

+0

Vielen Dank @martineau, Ihr Punkt über Postscript, der als Filmersatz konzipiert ist, macht Sinn. Ich werde ein großes Rechteck mit Höhe und Breite der Leinwand hinzufügen. Ich glaube nicht, dass ich Tkinter oder Tk direkt benutzen muss. Ich glaube, dass die tatsächlichen Variablen ts.window_width(), ts.window_height() sein werden. Wenn ich es zur Arbeit bekomme, werde ich den neuen Code für die Nachwelt veröffentlichen. –

1

Ich habe keine Möglichkeit gefunden, die Canvas-Hintergrundfarbe auf die generierte (gekapselte) PostScript-Datei zu bekommen (ich vermute, dass das nicht möglich ist). Sie können Ihren Kreis mit einer Farbe, aber füllen und dann Canvas.postscript(colormode='color') verwenden, wie von @mgilson vorgeschlagen:

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') 
+0

Ich schätze den Kommentar. Dies würde das Problem lösen, wenn ich nur Füllfarbe hinzufügen wollte. Die Idee wäre, die Variable bgcolor durchzukommen. Warten wir ab und sehen, ob jemand eine andere Antwort hat. Danke für Ihre Hilfe. –