📄 printout.py
字号:
self.printData.SetPaperId(wx.PAPER_LETTER)
self.printData.SetOrientation(wx.PORTRAIT)
self.page_width = 8.5
self.page_height = 11.0
def SetLandscape(self):
self.printData.SetOrientation(wx.LANDSCAPE)
self.page_width = 11.0
self.page_height = 8.5
def SetParms(self):
self.ymax = 1
self.xmax = 1
self.page = 1
self.total_pg = 100
self.preview = None
self.page = 0
self.default_font_name = "Arial"
self.default_font = { "Name": self.default_font_name, "Size": 10, "Colour": [0, 0, 0], "Attr": [0, 0, 0] }
def SetColAlignment(self, col, align=wx.ALIGN_LEFT):
self.set_column_align[col] = align
def SetColBackgroundColour(self, col, colour):
self.set_column_bgcolour[col] = colour
def SetColTextColour(self, col, colour):
self.set_column_txtcolour[col] = colour
def SetCellColour(self, row, col, colour): # cell background colour
try:
set = self.set_cell_colour[row] # test if row already exists
try:
set[col] = colour # test if column already exists
except:
set = { col: colour } # create the column value
except:
set = { col: colour } # create the column value
self.set_cell_colour[row] = set # create dictionary item for colour settings
def SetCellText(self, row, col, colour): # font colour for custom cells
try:
set = self.set_cell_text[row] # test if row already exists
try:
set[col] = colour # test if column already exists
except:
set = { col: colour } # create the column value
except:
set = { col: colour } # create the column value
self.set_cell_text[row] = set # create dictionary item for colour settings
def SetColumnLineSize(self, col, size): # column line size
self.column_line_size[col] = size # create dictionary item for column line settings
def SetColumnLineColour(self, col, colour):
self.column_line_colour[col] = colour
def SetRowLineSize(self, row, size):
self.row_line_size[row] = size
def SetRowLineColour(self, row, colour):
self.row_line_colour[row] = colour
def GetColour(self, colour): # returns colours based from wxColour value
red = colour.Red()
blue = colour.Blue()
green = colour.Green()
return [red, green, blue ]
def SetHeader(self, text = "", type = "Text", font=None, align = None, indent = None, colour = None, size = None):
set = { "Text": text }
if font is None:
set["Font"] = copy.copy(self.default_font)
else:
set["Font"] = font
if colour is not None:
setfont = set["Font"]
setfont["Colour"] = self.GetColour(colour)
if size is not None:
setfont = set["Font"]
setfont["Size"] = size
if align is None:
set["Align"] = self.header_align
else:
set["Align"] = align
if indent is None:
set["Indent"] = self.header_indent
else:
set["Indent"] = indent
if type is None:
set["Type"] = self.header_type
else:
set["Type"] = type
self.header.append(set)
def SetFooter(self, text = "", type = None, font=None, align = None, indent = None, colour = None, size = None):
set = { "Text": text }
if font is None:
set["Font"] = copy.copy(self.default_font)
else:
set["Font"] = font
if colour is not None:
setfont = set["Font"]
setfont["Colour"] = self.GetColour(colour)
if size is not None:
setfont = set["Font"]
setfont["Size"] = size
if align is None:
set["Align"] = self.footer_align
else:
set["Align"] = align
if indent is None:
set["Indent"] = self.footer_indent
else:
set["Indent"] = indent
if type is None:
set["Type"] = self.footer_type
else:
set["Type"] = type
self.footer.append(set)
def Preview(self):
data = wx.PrintDialogData(self.printData)
printout = SetPrintout(self)
printout2 = SetPrintout(self)
self.preview = wx.PrintPreview(printout, printout2, data)
if not self.preview.Ok():
wx.MessageBox("There was a problem printing!", "Printing", wx.OK)
return
self.preview.SetZoom(60) # initial zoom value
frame = wx.PreviewFrame(self.preview, self.parentFrame, "Print preview")
frame.Initialize()
if self.parentFrame:
frame.SetPosition(self.preview_frame_pos)
frame.SetSize(self.preview_frame_size)
frame.Show(True)
def Print(self):
pdd = wx.PrintDialogData(self.printData)
printer = wx.Printer(pdd)
printout = SetPrintout(self)
if not printer.Print(self.parentFrame, printout):
wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK)
else:
self.printData = wx.PrintData( printer.GetPrintDialogData().GetPrintData() )
printout.Destroy()
def DoDrawing(self, DC):
size = DC.GetSize()
DC.BeginDrawing()
table = PrintTableDraw(self, DC, size)
table.data = self.data
table.set_column = self.set_column
table.label = self.label
table.SetPage(self.page)
if self.preview is None:
table.SetPSize(size[0]/self.page_width, size[1]/self.page_height)
table.SetPTSize(size[0], size[1])
table.SetPreview(False)
else:
if self.preview == 1:
table.scale = self.scale
table.SetPSize(size[0]/self.page_width, size[1]/self.page_height)
else:
table.SetPSize(self.pwidth, self.pheight)
table.SetPTSize(self.ptwidth, self.ptheight)
table.SetPreview(self.preview)
table.OutCanvas()
self.page_total = table.total_pages # total display pages
DC.EndDrawing()
self.ymax = DC.MaxY()
self.xmax = DC.MaxX()
self.sizeh = size[0]
self.sizew = size[1]
def GetTotalPages(self):
self.page_total = 100
return self.page_total
def HasPage(self, page):
if page <= self.page_total:
return True
else:
return False
def SetPage(self, page):
self.page = page
def SetPageSize(self, width, height):
self.pwidth, self.pheight = width, height
def SetTotalSize(self, width, height):
self.ptwidth, self.ptheight = width, height
def SetPreview(self, preview, scale):
self.preview = preview
self.scale = scale
def SetTotalSize(self, width, height):
self.ptwidth = width
self.ptheight = height
class PrintGrid:
def __init__(self, parent, grid, format = [], total_col = None, total_row = None):
if total_row is None:
total_row = grid.GetNumberRows()
if total_col is None:
total_col = grid.GetNumberCols()
self.total_row = total_row
self.total_col = total_col
self.grid = grid
data = []
for row in range(total_row):
row_val = []
value = grid.GetRowLabelValue(row)
row_val.append(value)
for col in range(total_col):
value = grid.GetCellValue(row, col)
row_val.append(value)
data.append(row_val)
label = [""]
for col in range(total_col):
value = grid.GetColLabelValue(col)
label.append(value)
self.table = PrintTable(parent)
self.table.cell_left_margin = 0.0
self.table.cell_right_margin = 0.0
self.table.label = label
self.table.set_column = format
self.table.data = data
def GetTable(self):
return self.table
def SetAttributes(self):
for row in range(self.total_row):
for col in range(self.total_col):
colour = self.grid.GetCellTextColour(row, col-1)
self.table.SetCellText(row, col, colour)
colour = self.grid.GetCellBackgroundColour(row, col-1)
self.table.SetCellColour(row, col, colour)
def Preview(self):
self.table.Preview()
def Print(self):
self.table.Print()
class SetPrintout(wx.Printout):
def __init__(self, canvas):
wx.Printout.__init__(self)
self.canvas = canvas
self.end_pg = 1000
def OnBeginDocument(self, start, end):
return super(SetPrintout, self).OnBeginDocument(start, end)
def OnEndDocument(self):
super(SetPrintout, self).OnEndDocument()
def HasPage(self, page):
try:
end = self.canvas.HasPage(page)
return end
except:
return True
def GetPageInfo(self):
try:
self.end_pg = self.canvas.GetTotalPages()
except:
pass
end_pg = self.end_pg
str_pg = 1
return (str_pg, end_pg, str_pg, end_pg)
def OnPreparePrinting(self):
super(SetPrintout, self).OnPreparePrinting()
def OnBeginPrinting(self):
dc = self.GetDC()
self.preview = self.IsPreview()
if (self.preview):
self.pixelsPerInch = self.GetPPIScreen()
else:
self.pixelsPerInch = self.GetPPIPrinter()
(w, h) = dc.GetSize()
scaleX = float(w) / 1000
scaleY = float(h) / 1000
self.printUserScale = min(scaleX, scaleY)
super(SetPrintout, self).OnBeginPrinting()
def GetSize(self):
self.psizew, self.psizeh = self.GetPPIPrinter()
return self.psizew, self.psizeh
def GetTotalSize(self):
self.ptsizew, self.ptsizeh = self.GetPageSizePixels()
return self.ptsizew, self.ptsizeh
def OnPrintPage(self, page):
dc = self.GetDC()
(w, h) = dc.GetSize()
scaleX = float(w) / 1000
scaleY = float(h) / 1000
self.printUserScale = min(scaleX, scaleY)
dc.SetUserScale(self.printUserScale, self.printUserScale)
self.preview = self.IsPreview()
self.canvas.SetPreview(self.preview, self.printUserScale)
self.canvas.SetPage(page)
self.ptsizew, self.ptsizeh = self.GetPageSizePixels()
self.canvas.SetTotalSize(self.ptsizew, self.ptsizeh)
self.psizew, self.psizeh = self.GetPPIPrinter()
self.canvas.SetPageSize(self.psizew, self.psizeh)
self.canvas.DoDrawing(dc)
return True
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = wx.Frame(None, -1, "Dummy wx frame for testing printout.py")
frame.Show(True)
ptbl = PrintTable(frame)
ptbl.SetHeader('This is the test HEADER')
# a single sequence will print out as a single column with no borders ...
ptbl.data = (
'This is the first line of text.',
'This is the second line\nand the third. The fourth will be the number "4.0".',
04.00,
'This is the fifth line, but by design it is too long to fit in the width of a standard'\
' page, so it will be forced to wrap around in order to fit without having '\
'some of its verbose verbage truncated.',
'Here we have the final line.'
)
#... but, if labels or columns are defined, a single sequence will print out as a single row
##ptbl.label = ('One','Two','Three','Four','5')
ptbl.Preview()
app.MainLoop()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -