[gnome-devel-docs] Tutorials Python: example of generic widget (drawing with Cairo)
- From: Marta Maria Casetti <mmcasetti src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-devel-docs] Tutorials Python: example of generic widget (drawing with Cairo)
- Date: Sun, 24 Feb 2013 11:09:54 +0000 (UTC)
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]