2012-11-24 17 views
5

मैं पाइथन के लिए नया हूं और भाषा सीखने के तरीके के रूप में कछुए मॉड्यूल के साथ काम कर रहा हूं।एक .eps फ़ाइल में कछुए ग्राफिक्स को सहेजते समय, पृष्ठभूमि रंग स्क्रीन पर दिखाता है लेकिन .eps फ़ाइल में सहेजा नहीं जाता है

स्टैक ओवरफ्लो के लिए धन्यवाद, मैंने शोध किया और छवि को एक encapsulated पोस्टस्क्रिप्ट फ़ाइल में कॉपी करने के लिए सीखा और यह बहुत अच्छा काम करता है। हालांकि, एक समस्या है। turtle मॉड्यूल स्क्रीन पर दिखाए गए पृष्ठभूमि रंग की अनुमति देता है लेकिन .eps फ़ाइल में नहीं दिखाया गया है। अन्य सभी रंग, यानी पेन रंग और कछुए रंग, इसे पृष्ठभूमि रंग के माध्यम से बनाते हैं।

रुचि के मामले में, मुझे विश्वास नहीं है कि Tkinter का आयात आवश्यक है क्योंकि मुझे विश्वास नहीं है कि मैं यहां Tkinter मॉड्यूल का उपयोग कर रहा हूं। मैंने इसे समस्या का निदान करने की कोशिश करने के एक हिस्से के रूप में शामिल किया। मैंने s.bgcolor="orange" की बजाय 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 मुझे एक नया उपयोगकर्ता के रूप में ऐसा करने के लिए अनुमति नहीं दी जाएगी। कुछ प्रकार की स्पैम रोकथाम। हालांकि कल्पना करने के लिए पर्याप्त सरल, स्क्रीन नारंगी का पृष्ठभूमि रंग है और ईपीएस फ़ाइल सफेद है।

output produced from .eps file

मैं किसी भी विचार की सराहना करेंगे।

+0

जब यह उस भाग को हो जाता है मैं एक बस त्रुटि मिलती है ... हममम ... – mgilson

+0

क्या होगा अगर ऐसा होता है आप करते हैं: 'ts.getcanvas()। पोस्टस्क्रिप्ट (file = 'turtle.eps', colormode = 'color')'? – mgilson

+0

मैंने कोशिश की, colormode = 'रंग' जोड़ना, और कोई बदलाव नहीं। इसके अलावा, अन्य सभी रंग, यानी पेन और कछुए रंग के माध्यम से आते हैं। ऐसा लगता है कि केवल पृष्ठभूमि ही है .eps फ़ाइल में स्थानांतरित नहीं हो रहा है। –

उत्तर

3

पोस्टस्क्रिप्ट कागज या फिल्म, नहीं रेखापुंज ग्राफिक्स जैसे कुछ मध्यम पर निशान बनाने के लिए डिजाइन किया गया था। चूंकि इसमें पृष्ठभूमि रंग नहीं है जिसे रंग दिया जा सकता है क्योंकि यह आमतौर पर कागज का रंग या अप्रत्याशित फिल्म का उपयोग किया जाता है।

इसे अनुकरण करने के लिए आपको कैनवास के आकार को आयताकार खींचने और पृष्ठभूमि के रूप में इच्छित रंग से भरने की आवश्यकता है। मैंने getcanvas() द्वारा लौटाए गए कैनवास ऑब्जेक्ट से पूछताछ करने के लिए कछुए मॉड्यूल में कुछ भी नहीं देखा और एकमात्र विकल्प जिसे मैं सोच सकता हूं, अगर कोई है तो turtle.cfg फ़ाइल को पढ़ना है, या डिफ़ॉल्ट 300x400 आकार को हार्डकोड करना है। आप स्रोत को देखने और यह पता लगाने में सक्षम हो सकते हैं कि वर्तमान कैनवास के आयाम संग्रहीत किए जाते हैं और उन्हें सीधे एक्सेस करते हैं।

अद्यतन:

मैं सिर्फ turtle मॉड्यूल के साथ अजगर कंसोल में चारों ओर खेल रहा था और पता चला कि एक निजी विशेषता _canvas जो एक <Tkinter.Canvas instance> है कहा जाता है क्या कैनवास getcanvas() रिटर्न है। इस ऑब्जेक्ट में winfo_width() और winfo_height() विधियां हैं जिनमें वर्तमान कछुए ग्राफिक्स विंडो के आयाम शामिल हैं। तो मैं उस आकार के एक भरे आयत को चित्रित करने की कोशिश करता हूं और देखता हूं कि क्या आपको वह चाहिए जो आप चाहते हैं।

अद्यतन 2:

यहाँ कैसे मैं क्या सुझाव दिया करने के लिए दिखा कोड है। नोट: पृष्ठभूमि को से पहले किसी अन्य ग्राफिक्स को खींचा जाना है क्योंकि अन्यथा ठोस भरे हुए पृष्ठभूमि आयताकार स्क्रीन पर अन्य सभी को कवर करेंगे।

इसके अलावा, जोड़ा गया draw_background() फ़ंक्शन सहेजने के लिए पर्याप्त प्रयासों में जाता है और बाद में ग्राफिक्स स्थिति को पुनर्स्थापित करता है। यह आपके सटीक उपयोग के मामले के आधार पर आवश्यक नहीं हो सकता है।

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 

और यहाँ वास्तविक उत्पादन का उत्पादन (फ़ोटोशॉप के माध्यम से परदे पर प्रदान की गई) है:

output from eps file

+0

अंतर्निहित टीएस पोस्टस्क्रिप्ट पीढ़ी इंजन आधार पर पृष्ठभूमि के लिए कुछ भी नहीं करता है जो पीएस उत्पन्न करते समय आयत डालकर बहुत छोटा होता है (आप इसे बाद में सीधे हटा सकते हैं)। आयत का आकार उपयोग करने के लिए बिल्कुल वही निर्भर करता है जो आप पीएस उत्पन्न कर रहे हैं; यह केवल स्क्रीन पर दिखाई देने वाले _defaults_ ... –

+0

@DonalFellows: इस तरह के पृष्ठभूमि आयत का डिफ़ॉल्ट आकार और रंग होगा जो भी आपका स्वयं का कोड तय करेगा, क्योंकि वह स्वचालित रूप से नहीं बनाया जाएगा। मैं केवल आकार के लिए डिफ़ॉल्ट के रूप में उपयोग करने के लिए कुछ सुझाव देने की कोशिश कर रहा हूं। – martineau

+0

धन्यवाद @ मार्टिनौ, फिल्म प्रतिस्थापन के रूप में डिज़ाइन की गई पोस्टस्क्रिप्ट के बारे में आपका बिंदु समझ में आता है। मैं कैनवास की ऊंचाई और चौड़ाई के साथ एक बड़ा आयत जोड़ दूंगा। मुझे विश्वास नहीं है कि मुझे टिंकर या सीधे उपयोग करना है। मेरा मानना ​​है कि वास्तविक चर ts.window_width(), ts.window_height() होगा। अगर मैं इसे काम करने के लिए मिलता हूं तो मैं पोस्टरिटी के लिए नया कोड पोस्ट करूंगा। –

1

मुझे उत्पन्न (Encapsulated) पोस्टस्क्रिप्ट फ़ाइल पर कैनवास पृष्ठभूमि रंग प्राप्त करने का कोई तरीका नहीं मिला है (मुझे संदेह है कि यह संभव नहीं है)। आप फिर भी एक रंग के साथ अपने सर्कल भर सकते हैं, और फिर 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') 
+0

मैं टिप्पणी की सराहना करता हूं। अगर मैं केवल भरने वाले रंग को जोड़ने की कोशिश कर रहा था तो इससे समस्या हल हो जाएगी। विचार यह होगा कि bgcolor चर के माध्यम से आना होगा। आइए प्रतीक्षा करें और देखें कि किसी के पास दूसरा जवाब है या नहीं। आपकी सहायता के लिए धन्यवाद. –