2011-04-07 9 views
6

के साथ शुरू करने का सबसे तेज़ तरीका मैंने अतीत में काहिरा सीखने के शॉट्स पास किए हैं, लेकिन हमेशा कुछ अन्य ग्राफिक्स लाइब्रेरी के पक्ष में चले गए हैं। मेरी समस्या यह है कि मुझे एक अच्छा ट्यूटोरियल नहीं मिल रहा है जो मुझे मेरी सतह के लिए एक साधारण प्रदर्शन देता है। मैंने जीटीके या क्यूटी दस्तावेज के माध्यम से चीजों के बारे में हमेशा खुदाई की है जिनके साथ मैं कुछ भी नहीं करना चाहता हूं। मैं बड़े पैमाने पर ओओ वास्तुकला नहीं, काहिरा सीखना चाहता हूं।कैरो

एक कैरो कैनवास के साथ एक क्रॉस-प्लेटफ़ॉर्म विंडो देने के लिए एक नंगे हड्डियों का आवरण क्या है?

उत्तर

10

मैंने ड्राइंग से जुड़े किसी भी चीज़ के लिए कैरो का उपयोग किया है। मैं एक चिकित्सा सॉफ्टवेयर कंपनी में काम करता हूं, इसलिए मैं वैज्ञानिक डेटा विज़ुअलाइज़ेशन और अन्य चीजों का प्रोटोटाइप करता हूं।

मैं अपने चित्र प्रदर्शित करने के लिए आमतौर पर तीन तरीके हैं:

  1. एक जीटीके ड्राइंग क्षेत्र Python स्क्रिप्ट और जीटीके के साथ बनाया;
  2. पायथन छवि लाइब्रेरी show() विधि का उपयोग कर सीधे एक स्क्रीन पर प्रदर्शित एक पीएनजी छवि;
  3. एक पीएनजी छवि डिस्क पर सहेजी गई, पाइथन छवि लाइब्रेरी के माध्यम से भी।

एक साधारण cairographics उदाहरण है, जो वास्तव मैं किसी भी नई परियोजना के लिए एक टेम्पलेट के रूप में उपयोग, से ली गई स्क्रिप्ट है:

import gtk 

class Canvas(gtk.DrawingArea): 
    def __init__(self): 
     super(Canvas, self).__init__() 
     self.connect("expose_event", self.expose) 
     self.set_size_request(800,500) 

    def expose(self, widget, event): 
     cr = widget.window.cairo_create() 
     rect = self.get_allocation() 

     # you can use w and h to calculate relative positions which 
     # also change dynamically if window gets resized 
     w = rect.width 
     h = rect.height 

     # here is the part where you actually draw 
     cr.move_to(0,0) 
     cr.line_to(w/2, h/2) 
     cr.stroke() 

window = gtk.Window() 
canvas = Canvas() 
window.add(canvas) 
window.set_position(gtk.WIN_POS_CENTER) 
window.show_all() 
gtk.main() 

या यदि आप जीयूआई उपकरणकिटें के साथ सौदा नहीं करना चाहते, तो आप बना सकते हैं और कर सकते हैं स्क्रीन पर एक छवि प्रदर्शित करें, और वैकल्पिक रूप से इसे फ़ाइल में सहेजें:

import cairo, Image 

width = 800 
height = 600 

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) 
cr = cairo.Context(surface) 

# optional conversion from screen to cartesian coordinates: 
cr.translate(0, height) 
cr.scale(1, -1) 

# something very similar to Japanese flag: 
cr.set_source_rgb(1,1,1) 
cr.rectangle(0, 0, width, height) 
cr.fill() 
cr.arc(width/2, height/2, 150, 0, 6.28) 
cr.set_source_rgb(1,0,0) 
cr.fill() 

im = Image.frombuffer("RGBA", 
         (width, height), 
         surface.get_data(), 
         "raw", 
         "BGRA", 
         0,1) # don't ask me what these are! 
im.show() 
# im.save('filename', 'png') 
+0

इसके लिए धन्यवाद। मैं बस काम करने के लिए हुप्स के एक टन से कूद गया (ओएस एक्स पर पीआईएल के लिए पूरी तरह से टूटी हुई इंस्टॉलेशन प्रक्रिया सहित)। मुझे डर है कि यह नौसिखिया उपयोगकर्ताओं के लिए पूरी तरह से अनुपयुक्त है। (यह भी नहीं होना चाहिए: पीआईएल आयात छवि से?) – Alper

+0

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

+0

इसके अलावा: पाइथन खूनी जावास्क्रिप्ट की तुलना में इस सामान को करने का एक और अधिक सभ्य तरीका है। – Alper

1

related question का उत्तर काहिरा के साथ ड्राइंग एरिया पर आकर्षित करने के लिए जीटीके 2 एचएस में एक बहुत ही सरल सेटअप दर्शाता है।

import Graphics.UI.Gtk 
import Graphics.Rendering.Cairo 

main :: IO() 
main = do 
    initGUI 
    window  <- windowNew 
    drawingArea <- drawingAreaNew 
    containerAdd window drawingArea 

    drawingArea `onExpose` (\_ -> renderScene drawingArea) 
    window `onDestroy` mainQuit 

    windowSetDefaultSize window 640 480 
    widgetShowAll window 
    mainGUI 

renderScene :: DrawingArea -> IO Bool 
renderScene da = do 
    dw <- widgetGetDrawWindow da 
    renderWithDrawable dw $ do setSourceRGBA 0.5 0.5 0.5 1.0 
           moveTo 100.0 100.0 
           showText "HelloWorld" 

    return True 

सीधे शब्दों में renderScene में renderWithDrawable dw करने के लिए अपने काहिरा एनीमेशन दिनचर्या गुजरती हैं।

संबंधित मुद्दे