~doctormo/python-snippets/lp-merge-request-example

« back to all changes in this revision

Viewing changes to pygtk/cairo_demo.py

  • Committer: Jono Bacon
  • Date: 2010-01-22 19:43:23 UTC
  • mfrom: (18.1.2 python-snippets)
  • Revision ID: jono@ubuntu.com-20100122194323-3gkor45n2g2z0ehl
Cairo example and drawing area fix, thanks Jurjen!

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
#
 
3
# [SNIPPET_NAME: Drawing With Cairo]
 
4
# [SNIPPET_CATEGORIES: PyGTK, Cairo]
 
5
# [SNIPPET_DESCRIPTION: Create a drawing with cairo]
 
6
# [SNIPPET_AUTHOR: Jurjen Stellingwerff <jurjen@stwerff.xs4all.nl>]
 
7
# [SNIPPET_LICENSE: GPL]
 
8
 
 
9
# example cairo_demo.py
 
10
 
 
11
import pygtk
 
12
pygtk.require('2.0')
 
13
import gtk
 
14
import math
 
15
import cairo
 
16
 
 
17
class DrawingAreaExample:
 
18
    def __init__(self):
 
19
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
 
20
        window.set_title("Drawing With Cairo")
 
21
        window.connect("destroy", lambda w: gtk.main_quit())
 
22
        self.area = gtk.DrawingArea()
 
23
        self.area.set_size_request(380, 300)
 
24
        window.add(self.area)
 
25
        self.area.connect("expose-event", self.expose)
 
26
        self.area.show()
 
27
        window.show()
 
28
 
 
29
    def expose(self, area, event):
 
30
        self.context = area.window.cairo_create()
 
31
        self.context.rectangle(event.area.x, event.area.y, event.area.width,
 
32
            event.area.height)
 
33
        self.context.clip()
 
34
        self.context.scale(event.area.width/380.0, event.area.height/300.0)
 
35
        self.draw_point(10,10)
 
36
        self.draw_points(110, 10)
 
37
        self.draw_line(210, 10)
 
38
        self.draw_lines(310, 10)
 
39
        self.draw_segments(10, 100)
 
40
        self.draw_rectangles(110, 100)
 
41
        self.draw_arcs(210, 100)
 
42
        self.draw_pixmap(310, 100)
 
43
        self.draw_polygon(10, 200)
 
44
        self.draw_rgb_image(110, 200)
 
45
        self.context.move_to(210, 290)
 
46
        self.context.show_text("Try to resize the window")
 
47
        return False
 
48
 
 
49
    def point(self, x, y):
 
50
        self.context.arc(x, y, 1, 0.0, 2.0 * math.pi)
 
51
        self.context.fill()
 
52
 
 
53
    def draw_point(self, x, y):
 
54
        self.point(x+30, y+30)
 
55
        self.context.move_to(x+5, y+50)
 
56
        self.context.show_text("Point")
 
57
        return
 
58
 
 
59
    def draw_points(self, x, y):
 
60
        points = [(x+10,y+10), (x+10,y), (x+40,y+30),
 
61
                 (x+30,y+10), (x+50,y+10)]
 
62
        for px,py in points:
 
63
            self.point(px,py)
 
64
        self.context.move_to(x+5, y+50)
 
65
        self.context.show_text("Points")
 
66
        return
 
67
 
 
68
    def draw_line(self, x, y):
 
69
        self.context.move_to(x+10, y+10)
 
70
        self.context.line_to(x+20, y+30)
 
71
        self.context.stroke()
 
72
        self.context.move_to(x+5, y+50)
 
73
        self.context.show_text("Line")
 
74
        return
 
75
 
 
76
    def draw_lines(self, x, y):
 
77
        points = [(x+10,y), (x+40,y+30),
 
78
                  (x+30,y+10), (x+50,y+10)]
 
79
        self.context.move_to(x+10, y+10)
 
80
        for px,py in points:
 
81
            self.context.line_to(px, py)
 
82
        self.context.set_line_width(4.5)
 
83
        self.context.stroke()
 
84
        self.context.save()
 
85
        self.context.set_source_rgb(1, 1, 0.7)
 
86
        self.context.translate(1.5, 1)
 
87
        self.context.move_to(x+10, y+10)
 
88
        for px,py in points:
 
89
            self.context.line_to(px, py)
 
90
        self.context.set_line_width(1.5)
 
91
        self.context.stroke()
 
92
        self.context.restore()
 
93
        self.context.set_line_width(2)
 
94
        self.context.move_to(x+5, y+50)
 
95
        self.context.show_text("Lines")
 
96
        return
 
97
 
 
98
    def draw_segments(self, x, y):
 
99
        segments = ((x+20,y+10, x+20,y+70), (x+60,y+10, x+60,y+70),
 
100
            (x+10,y+30 , x+70,y+30), (x+10, y+50 , x+70, y+50))
 
101
        for fx, fy, tx, ty in segments:
 
102
            self.context.move_to(fx, fy)
 
103
            self.context.line_to(tx, ty)
 
104
        self.context.stroke()
 
105
        self.context.move_to(x+5, y+90)
 
106
        self.context.show_text("Segments")
 
107
        return
 
108
 
 
109
    def draw_rectangles(self, x, y):
 
110
        self.context.save()
 
111
        self.context.set_source_rgb(.6, 0, 0)
 
112
        self.context.rectangle(x, y, 80, 70)
 
113
        self.context.stroke()
 
114
        self.context.restore()
 
115
        rectangles = ((x+10, y+10, 20, 20), (x+50, y+10, 20, 20), (x+20, y+50, 40, 10))
 
116
        for px, py, h, w in rectangles:
 
117
            self.context.rectangle(px, py, h, w)
 
118
            self.context.fill()
 
119
        self.context.move_to(x+5, y+90)
 
120
        self.context.show_text("Rectangles")
 
121
        return
 
122
 
 
123
    def draw_arcs(self, x, y):
 
124
        self.context.set_line_width(1)
 
125
        arcs = [(False, x+45, y+35, 35),
 
126
            (True, x+35, y+25, 5),
 
127
            (True, x+55, y+25, 5)]
 
128
        for fill, px, py, r in arcs:
 
129
            self.context.move_to(px+r, py)
 
130
            self.context.arc(px, py, r, 0, 2*math.pi)
 
131
            if fill:
 
132
                self.context.fill()
 
133
            else:
 
134
                self.context.set_source_rgb(1, 1, 0.5)
 
135
                self.context.fill_preserve()
 
136
                self.context.set_source_rgb(0, 0, 0)
 
137
                self.context.stroke()
 
138
        self.context.move_to(x+45, y+35)
 
139
        s = 1.66
 
140
        self.context.save()
 
141
        self.context.scale(1, s)
 
142
        self.context.arc(x+45, (y+35)/s, 15, 30*math.pi/180, 150*math.pi/180)
 
143
        self.context.restore()
 
144
        self.context.save()
 
145
        self.context.move_to(x+5, y+90)
 
146
        self.context.select_font_face("serif", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
 
147
        self.context.show_text("Arcs")
 
148
        self.context.restore()
 
149
        return
 
150
 
 
151
    def draw_pixmap(self, x, y):
 
152
        try:
 
153
            img = cairo.ImageSurface.create_from_png("gtk.png")
 
154
        except Exception, e:
 
155
            print e
 
156
            exit(1)
 
157
        self.context.save()
 
158
        self.context.set_source_surface(img, x+5, y+15)
 
159
        self.context.paint()
 
160
        self.context.restore()
 
161
        self.context.move_to(x+5, y+90)
 
162
        self.context.show_text("Pixmap")
 
163
        return
 
164
 
 
165
    def draw_polygon(self, x, y):
 
166
        points = [(x+10,y+20), (x+40,y+70),
 
167
                  (x+30,y+30), (x+50,y+40)]
 
168
        self.context.move_to(x+10, y+60)
 
169
        for px,py in points:
 
170
            self.context.line_to(px, py)
 
171
        self.context.fill()
 
172
        self.context.move_to(x+5, y+90)
 
173
        self.context.show_text("Polygon")
 
174
        return
 
175
 
 
176
    def draw_rgb_image(self, x, y):
 
177
        s = 80
 
178
        h = 40
 
179
        self.context.save()
 
180
        linpat = cairo.LinearGradient(x, y, x+s, y+s)
 
181
        linpat.add_color_stop_rgb(0.0, 1, 1, 1)
 
182
        linpat.add_color_stop_rgb(1.0, 0, 1, 0)
 
183
        self.context.set_source(linpat)
 
184
        self.context.move_to(x,y)
 
185
        self.context.line_to(x,y+s)
 
186
        self.context.line_to(x+s,y+s)
 
187
        self.context.line_to(x+s,y)
 
188
        self.context.fill()
 
189
        linpat = cairo.LinearGradient(x, y+s, x+s, y)
 
190
        linpat.add_color_stop_rgba(0.0, 0, 0, 1, 1)
 
191
        linpat.add_color_stop_rgba(0.5, 1, 0, 1, 0)
 
192
        linpat.add_color_stop_rgba(1.0, 1, 0, 0, 1)
 
193
        self.context.set_source(linpat)
 
194
        self.context.move_to(x,y)
 
195
        self.context.line_to(x,y+s)
 
196
        self.context.line_to(x+s,y+s)
 
197
        self.context.line_to(x+s,y)
 
198
        self.context.fill()
 
199
        self.context.restore()
 
200
        self.context.save()
 
201
        self.context.move_to(x+5, y+92)
 
202
        self.context.set_font_size(11.5)
 
203
        self.context.show_text("RGB Image")
 
204
        self.context.restore()
 
205
        return
 
206
 
 
207
def main():
 
208
    gtk.main()
 
209
    return 0
 
210
 
 
211
if __name__ == "__main__":
 
212
    DrawingAreaExample()
 
213
    main()
 
214