[gnome-devel-docs] Tutorials Python: example of generic widget (drawing with Cairo)



commit f845f6c38869846f09ea5a4b6bd19159a44f06a4
Author: Marta Maria Casetti <mmcasetti gmail com>
Date:   Sun Feb 24 10:07:59 2013 +0100

    Tutorials Python: example of generic widget (drawing with Cairo)

 platform-demos/C/media/widget_drawing.png  |  Bin 0 -> 10656 bytes
 platform-demos/C/samples/widget_drawing.py |   83 ++++++++++++++++++++++++++++
 platform-demos/C/widget_drawing.py.page    |   42 ++++++++++++++
 3 files changed, 125 insertions(+), 0 deletions(-)
---
diff --git a/platform-demos/C/media/widget_drawing.png b/platform-demos/C/media/widget_drawing.png
new file mode 100644
index 0000000..38cdc66
Binary files /dev/null and b/platform-demos/C/media/widget_drawing.png differ
diff --git a/platform-demos/C/samples/widget_drawing.py b/platform-demos/C/samples/widget_drawing.py
new file mode 100644
index 0000000..6e8588f
--- /dev/null
+++ b/platform-demos/C/samples/widget_drawing.py
@@ -0,0 +1,83 @@
+from gi.repository import Gtk
+from gi.repository import cairo
+import sys
+import math
+
+class MyWindow(Gtk.ApplicationWindow):
+    def __init__(self, app):
+        Gtk.Window.__init__(self, title="Choose an angle", application=app)
+        self.set_default_size(400, 400)
+        self.set_border_width(10)
+
+        # a default angle
+        self.angle = 360
+
+        grid = Gtk.Grid()
+        
+        # a spinbutton that takes the value of an angle
+        ad = Gtk.Adjustment(360, 0, 360, 1, 0, 0)
+        self.spin = Gtk.SpinButton(adjustment=ad, climb_rate=1, digits=0)
+        self.spin.connect("value-changed", self.get_angle)
+
+        # a drawing area for drawing whatever we want
+        self.darea = Gtk.DrawingArea()
+        # that we describe in the method draw(), connected to the signal "draw"
+        self.darea.connect("draw", self.draw)
+        # we have to request a minimum size of the drawing area, or it will disappear
+        self.darea.set_size_request(300, 300)
+
+        grid.attach(self.spin, 0, 0, 1, 1)
+        grid.attach(self.darea, 0, 1, 1, 1)
+        
+        self.add(grid)
+        
+    # whenever we get a new angle in the spinbutton    
+    def get_angle(self, event):
+        self.angle = self.spin.get_value_as_int()
+        # redraw what is in the drawing area
+        self.darea.queue_draw()
+                
+    def draw(self, darea, cr):
+        # a 10-pixels-wide line
+        cr.set_line_width(10)
+        # red
+        cr.set_source_rgba(0.5, 0.0, 0.0, 1.0)
+        
+        # get the width and height of the drawing area        
+        w = self.darea.get_allocated_width()
+        h = self.darea.get_allocated_height()
+
+        # move to the center of the drawing area 
+        # (translate from the top left corner to w/2, h/2)
+        cr.translate(w/2, h/2)
+        # draw a line to (55, 0)
+        cr.line_to(55, 0)
+        # and get back to (0, 0)
+        cr.line_to(0, 0)
+        # draw an arc centered in the origin, 50 pixels wide, from the angle 0 
+        # (in radians) to the angle given by the spinbutton (in degrees)
+        cr.arc(0, 0, 50, 0, self.angle*(math.pi/180))
+        # draw a line back to the origin
+        cr.line_to(0, 0)
+        # drawing the path, and keeping the path for future use
+        cr.stroke_preserve()
+        
+        # set a colour
+        cr.set_source_rgba(0.0, 0.5, 0.5, 1.0)
+        # and use it to fill the path (that we had kept)
+        cr.fill()
+
+class MyApplication(Gtk.Application):
+    def __init__(self):
+        Gtk.Application.__init__(self)
+
+    def do_activate(self):
+        win = MyWindow(self)
+        win.show_all()
+
+    def do_startup(self):
+        Gtk.Application.do_startup(self)
+
+app = MyApplication()
+exit_status = app.run(sys.argv)
+sys.exit(exit_status)
diff --git a/platform-demos/C/widget_drawing.py.page b/platform-demos/C/widget_drawing.py.page
new file mode 100644
index 0000000..157a22d
--- /dev/null
+++ b/platform-demos/C/widget_drawing.py.page
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<page xmlns="http://projectmallard.org/1.0/";
+      xmlns:xi="http://www.w3.org/2001/XInclude";
+      type="guide" style="task"
+      id="spinner.py">
+  <info>
+    <title type="text">Widget (Python)</title>
+    <link type="guide" xref="beginner.py#misc"/>
+    <revision version="0.1" date="2013-02-24" status="stub"/>
+
+    <credit type="author copyright">
+      <name>Marta Maria Casetti</name>
+      <email>mmcasetti gmail com</email>
+      <years>2013</years>
+    </credit>
+
+    <desc>A widget that uses the Cairo library to draw</desc>
+  </info>
+
+  <title>Widget</title>
+  <media type="image" mime="image/png" src="media/widget_drawing.png"/>
+  <p>Enter an angle, visualize it.</p>
+
+  <links type="section" />
+
+  <section id="code">
+  <title>Code used to generate this example</title>
+
+  <code mime="text/x-python" style="numbered"><xi:include href="samples/widget_drawing.py" 
parse="text"><xi:fallback/></xi:include></code>
+
+  </section>
+  
+  <section id="references">
+  <title>API References</title>
+  <p>In this sample we used the following:</p>
+  <list>
+    <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkWidget.html";>GtkWidget</link></p></item>
+    <item><p><link 
href="http://developer.gnome.org/gtk3/unstable/GtkDrawingArea.html";>GtkDrawingArea</link></p></item>
+    <item><p><link href="http://www.tortall.net/mu/wiki/CairoTutorial";>The Cairo Tutorial for Python 
Programmers</link></p></item>
+  </list>
+  </section>
+</page>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]