]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/PrintFramework.py
5 #----------------------------------------------------------------------
8 ID_Preview
= wx
.NewId()
11 class MyPrintout(wx
.Printout
):
12 def __init__(self
, canvas
, log
):
13 wx
.Printout
.__init
__(self
)
17 def OnBeginDocument(self
, start
, end
):
18 self
.log
.WriteText("wx.Printout.OnBeginDocument\n")
19 return self
.base_OnBeginDocument(start
, end
)
21 def OnEndDocument(self
):
22 self
.log
.WriteText("wx.Printout.OnEndDocument\n")
23 self
.base_OnEndDocument()
25 def OnBeginPrinting(self
):
26 self
.log
.WriteText("wx.Printout.OnBeginPrinting\n")
27 self
.base_OnBeginPrinting()
29 def OnEndPrinting(self
):
30 self
.log
.WriteText("wx.Printout.OnEndPrinting\n")
31 self
.base_OnEndPrinting()
33 def OnPreparePrinting(self
):
34 self
.log
.WriteText("wx.Printout.OnPreparePrinting\n")
35 self
.base_OnPreparePrinting()
37 def HasPage(self
, page
):
38 self
.log
.WriteText("wx.Printout.HasPage: %d\n" % page
)
44 def GetPageInfo(self
):
45 self
.log
.WriteText("wx.Printout.GetPageInfo\n")
48 def OnPrintPage(self
, page
):
49 self
.log
.WriteText("wx.Printout.OnPrintPage: %d\n" % page
)
52 #-------------------------------------------
53 # One possible method of setting scaling factors...
55 maxX
= self
.canvas
.getWidth()
56 maxY
= self
.canvas
.getHeight()
58 # Let's have at least 50 device units margin
62 # Add the margin to the graphic size
63 maxX
= maxX
+ (2 * marginX
)
64 maxY
= maxY
+ (2 * marginY
)
66 # Get the size of the DC in pixels
67 (w
, h
) = dc
.GetSizeTuple()
69 # Calculate a suitable scaling factor
70 scaleX
= float(w
) / maxX
71 scaleY
= float(h
) / maxY
73 # Use x or y scaling factor, whichever fits on the DC
74 actualScale
= min(scaleX
, scaleY
)
76 # Calculate the position on the DC for centering the graphic
77 posX
= (w
- (self
.canvas
.getWidth() * actualScale
)) / 2.0
78 posY
= (h
- (self
.canvas
.getHeight() * actualScale
)) / 2.0
80 # Set the scale and origin
81 dc
.SetUserScale(actualScale
, actualScale
)
82 dc
.SetDeviceOrigin(int(posX
), int(posY
))
84 #-------------------------------------------
86 self
.canvas
.DoDrawing(dc
, True)
87 dc
.DrawText("Page: %d" % page
, marginX
/2, maxY
-marginY
)
92 #----------------------------------------------------------------------
95 class TestPrintPanel(wx
.Panel
):
96 def __init__(self
, parent
, frame
, log
):
97 wx
.Panel
.__init
__(self
, parent
, -1)
101 self
.printData
= wx
.PrintData()
102 self
.printData
.SetPaperId(wx
.PAPER_LETTER
)
103 self
.printData
.SetPrintMode(wx
.PRINT_MODE_PRINTER
)
105 self
.box
= wx
.BoxSizer(wx
.VERTICAL
)
106 self
.canvas
= ScrolledWindow
.MyCanvas(self
)
107 self
.box
.Add(self
.canvas
, 1, wx
.GROW
)
109 subbox
= wx
.BoxSizer(wx
.HORIZONTAL
)
110 btn
= wx
.Button(self
, ID_Setup
, "Print Setup")
111 self
.Bind(wx
.EVT_BUTTON
, self
.OnPrintSetup
, btn
)
112 subbox
.Add(btn
, 1, wx
.GROW | wx
.ALL
, 2)
114 btn
= wx
.Button(self
, ID_Preview
, "Print Preview")
115 self
.Bind(wx
.EVT_BUTTON
, self
.OnPrintPreview
, btn
)
116 subbox
.Add(btn
, 1, wx
.GROW | wx
.ALL
, 2)
118 btn
= wx
.Button(self
, ID_Print
, "Print")
119 self
.Bind(wx
.EVT_BUTTON
, self
.OnDoPrint
, btn
)
120 subbox
.Add(btn
, 1, wx
.GROW | wx
.ALL
, 2)
122 self
.box
.Add(subbox
, 0, wx
.GROW
)
124 self
.SetAutoLayout(True)
125 self
.SetSizer(self
.box
)
128 def OnPrintSetup(self
, event
):
129 data
= wx
.PrintDialogData(self
.printData
)
130 printerDialog
= wx
.PrintDialog(self
, data
)
131 printerDialog
.GetPrintDialogData().SetSetupDialog(True)
132 printerDialog
.ShowModal();
133 self
.printData
= printerDialog
.GetPrintDialogData().GetPrintData()
134 printerDialog
.Destroy()
137 def OnPrintPreview(self
, event
):
138 self
.log
.WriteText("OnPrintPreview\n")
139 data
= wx
.PrintDialogData(self
.printData
)
140 printout
= MyPrintout(self
.canvas
, self
.log
)
141 printout2
= MyPrintout(self
.canvas
, self
.log
)
142 self
.preview
= wx
.PrintPreview(printout
, printout2
, data
)
144 if not self
.preview
.Ok():
145 self
.log
.WriteText("Houston, we have a problem...\n")
148 frame
= wx
.PreviewFrame(self
.preview
, self
.frame
, "This is a print preview")
151 frame
.SetPosition(self
.frame
.GetPosition())
152 frame
.SetSize(self
.frame
.GetSize())
157 def OnDoPrint(self
, event
):
158 pdd
= wx
.PrintDialogData(self
.printData
)
160 printer
= wx
.Printer(pdd
)
161 printout
= MyPrintout(self
.canvas
, self
.log
)
163 if not printer
.Print(self
.frame
, printout
, True):
164 wx
.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx
.OK
)
166 self
.printData
= printer
.GetPrintDialogData().GetPrintData()
170 #----------------------------------------------------------------------
172 def runTest(frame
, nb
, log
):
173 win
= TestPrintPanel(nb
, frame
, log
)
177 #----------------------------------------------------------------------
186 <h1>PrintFramework</h1>
188 This is an overview of the classes and methods used to print documents.
189 It also demonstrates how to do print previews and invoke the printer
192 <p>Classes demonstrated here:<P>
194 <li><b>wx.Printout()</b> - This class encapsulates the functionality of printing out
195 an application document. A new class must be derived and members overridden
196 to respond to calls such as OnPrintPage and HasPage. Instances of this class
197 are passed to wx.Printer.Print() or a wx.PrintPreview object to initiate
198 printing or previewing.<P><p>
200 <li><b>wx.PrintData()</b> - This class holds a variety of information related to
201 printers and printer device contexts. This class is used to create a
202 wx.PrinterDC and a wx.PostScriptDC. It is also used as a data member of
203 wx.PrintDialogData and wx.PageSetupDialogData, as part of the mechanism for
204 transferring data between the print dialogs and the application.<p><p>
206 <li><b>wx.PrintDialog()</b> - This class represents the print and print setup
207 common dialogs. You may obtain a wx.PrinterDC device context from a
208 successfully dismissed print dialog.<p><p>
210 <li><b>wx.PrintPreview()</b> - Objects of this class manage the print preview
211 process. The object is passed a wx.Printout object, and the wx.PrintPreview
212 object itself is passed to a wx.PreviewFrame object. Previewing is started by
213 initializing and showing the preview frame. Unlike wxPrinter.Print, flow of
214 control returns to the application immediately after the frame is shown.<p><p>
217 <p>Other classes are also demonstrated, but this is the gist of the printer interface
218 framework in wxPython.
226 if __name__
== '__main__':
229 run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])