]>
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("MyPrintout.OnBeginDocument\n")
19 return super(MyPrintout
, self
).OnBeginDocument(start
, end
)
21 def OnEndDocument(self
):
22 self
.log
.WriteText("MyPrintout.OnEndDocument\n")
23 super(MyPrintout
, self
).OnEndDocument()
25 def OnBeginPrinting(self
):
26 self
.log
.WriteText("MyPrintout.OnBeginPrinting\n")
27 super(MyPrintout
, self
).OnBeginPrinting()
29 def OnEndPrinting(self
):
30 self
.log
.WriteText("MyPrintout.OnEndPrinting\n")
31 super(MyPrintout
, self
).OnEndPrinting()
33 def OnPreparePrinting(self
):
34 self
.log
.WriteText("MyPrintout.OnPreparePrinting\n")
35 super(MyPrintout
, self
).OnPreparePrinting()
37 def HasPage(self
, page
):
38 self
.log
.WriteText("MyPrintout.HasPage: %d\n" % page
)
44 def GetPageInfo(self
):
45 self
.log
.WriteText("MyPrintout.GetPageInfo\n")
48 def OnPrintPage(self
, page
):
49 self
.log
.WriteText("MyPrintout.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();
134 # this makes a copy of the wx.PrintData instead of just saving
135 # a reference to the one inside the PrintDialogData that will
136 # be destroyed when the dialog is destroyed
137 self
.printData
= wx
.PrintData( printerDialog
.GetPrintDialogData().GetPrintData() )
139 printerDialog
.Destroy()
142 def OnPrintPreview(self
, event
):
143 self
.log
.WriteText("OnPrintPreview\n")
144 data
= wx
.PrintDialogData(self
.printData
)
145 printout
= MyPrintout(self
.canvas
, self
.log
)
146 printout2
= MyPrintout(self
.canvas
, self
.log
)
147 self
.preview
= wx
.PrintPreview(printout
, printout2
, data
)
149 if not self
.preview
.Ok():
150 self
.log
.WriteText("Houston, we have a problem...\n")
153 frame
= wx
.PreviewFrame(self
.preview
, self
.frame
, "This is a print preview")
156 frame
.SetPosition(self
.frame
.GetPosition())
157 frame
.SetSize(self
.frame
.GetSize())
162 def OnDoPrint(self
, event
):
163 pdd
= wx
.PrintDialogData(self
.printData
)
165 printer
= wx
.Printer(pdd
)
166 printout
= MyPrintout(self
.canvas
, self
.log
)
168 if not printer
.Print(self
.frame
, printout
, True):
169 wx
.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx
.OK
)
171 self
.printData
= wx
.PrintData( printer
.GetPrintDialogData().GetPrintData() )
175 #----------------------------------------------------------------------
177 def runTest(frame
, nb
, log
):
178 win
= TestPrintPanel(nb
, frame
, log
)
182 #----------------------------------------------------------------------
191 <h1>PrintFramework</h1>
193 This is an overview of the classes and methods used to print documents.
194 It also demonstrates how to do print previews and invoke the printer
197 <p>Classes demonstrated here:<P>
199 <li><b>wx.Printout()</b> - This class encapsulates the functionality of printing out
200 an application document. A new class must be derived and members overridden
201 to respond to calls such as OnPrintPage and HasPage. Instances of this class
202 are passed to wx.Printer.Print() or a wx.PrintPreview object to initiate
203 printing or previewing.<P><p>
205 <li><b>wx.PrintData()</b> - This class holds a variety of information related to
206 printers and printer device contexts. This class is used to create a
207 wx.PrinterDC and a wx.PostScriptDC. It is also used as a data member of
208 wx.PrintDialogData and wx.PageSetupDialogData, as part of the mechanism for
209 transferring data between the print dialogs and the application.<p><p>
211 <li><b>wx.PrintDialog()</b> - This class represents the print and print setup
212 common dialogs. You may obtain a wx.PrinterDC device context from a
213 successfully dismissed print dialog.<p><p>
215 <li><b>wx.PrintPreview()</b> - Objects of this class manage the print preview
216 process. The object is passed a wx.Printout object, and the wx.PrintPreview
217 object itself is passed to a wx.PreviewFrame object. Previewing is started by
218 initializing and showing the preview frame. Unlike wxPrinter.Print, flow of
219 control returns to the application immediately after the frame is shown.<p><p>
222 <p>Other classes are also demonstrated, but this is the gist of the printer interface
223 framework in wxPython.
231 if __name__
== '__main__':
234 run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])