ActiveState Code

Recipe 576820: Printing with Python and pyGTK


PyGTK is a very powerful GUI-Toolkit. Nearly everything is well documented, except how to print. I messed around for hours just to solve this problem so I decided to share this cool piece of code!

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# 
# written by Mark Muzenhardt <mark.muzenhardt@googlemail.com>
# published under BSD-License
 
import pygtk
pygtk.require('2.0')
import gtk
 
 
class DrawingAreaExample:
    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_title("Drawing Area Example")
        window.connect("destroy", lambda w: gtk.main_quit())
        self.area = gtk.DrawingArea()
        self.area.set_size_request(400, 300)
        window.add(self.area)
 
        self.area.connect("expose-event", self.area_expose_cb)
        self.area.show()
        window.show()
        self.do_print()
 
    def area_expose_cb(self, area, event):
        self.style = self.area.get_style()
        self.gc = self.style.fg_gc[gtk.STATE_NORMAL]
        self.draw_text()
        return True
 
    def do_print(self):
        print_op = gtk.PrintOperation()
        print_op.set_n_pages(1)
        print_op.connect("draw_page", self.print_text)
        res = print_op.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, None)
 
    def draw_text(self):
        self.pangolayout = self.area.create_pango_layout("")
        self.format_text()
        self.area.window.draw_layout(self.gc, 10, 10, self.pangolayout)
        return
 
    def print_text(self, operation=None, context=None, page_nr=None):
        self.pangolayout = context.create_pango_layout()
        self.format_text()
        cairo_context = context.get_cairo_context()
        cairo_context.show_layout(self.pangolayout)
        return
 
    def format_text(self):
        self.pangolayout.set_text(unicode("""
Dies ist ein Text-Test. Er funktioniert gut und zeigt, dass auch PyGTK
das drucken kann, was man auf eine DrawingArea geschrieben hat.
Anwendungen dafür gibt es genug! 
""", "latin-1"))
 
 
def main():
    gtk.main()
    return 0
 
if __name__ == "__main__":
    DrawingAreaExample()
    main()

Comments

  1. 1. At 2:43 a.m. on 26 jun 2009, Dave McCormack said:

    Ok. Now that I have this, how do I install it so I can use Python from the command line? I need specific step by step procedures. I'm just a newphyte with ZERO programming experience.

  2. 2. At 8:20 a.m. on 27 jun 2009, Mark Muzenhardt (the author) said:

    This is a GTK application which means you have to install pyGTK before it runs. You can start it from the command line like any other python program too. It doesn't have to be installed, because it is just a script (not a printing library).

Sign in to comment