📄 printout.py
字号:
self.SetPrintFont(self.text_font)
x, y = self.DC.GetTextExtent("W")
self.space = y
if self.total_pages is None:
self.GetTotalPages() # total pages for display/printing
self.data_cnt = self.page_index[self.page-1]
self.draw = True
self.PrintHeader()
self.PrintFooter()
self.OutPage()
def GetTotalPages(self):
self.data_cnt = 0
self.draw = False
self.page_index = [0]
cnt = 0
while 1:
test = self.OutPage()
self.page_index.append(self.data_cnt)
if test == False:
break
cnt = cnt + 1
self.total_pages = cnt + 1
def OutPage(self):
self.y = self.y_start
self.end_x = self.column[-1]
if self.data_cnt < len(self.data): # if there data for display on the page
if self.label != []: # check if header defined
self.PrintLabel()
else:
return False
for val in self.data:
try:
row_val = self.data[self.data_cnt]
except:
self.FinishDraw()
return False
max_y = self.PrintRow(row_val, False) # test to see if row will fit in remaining space
test = max_y + self.space
if test > self.y_end:
break
self.ColourRowCells(max_y-self.y+self.space) # colour the row/column
max_y = self.PrintRow(row_val, True) # row fits - print text
self.DrawGridLine() # top line of cell
self.y = max_y + self.space
if self.y > self.y_end:
break
self.data_cnt = self.data_cnt + 1
self.FinishDraw()
if self.data_cnt == len(self.data): # last value in list
return False
return True
def PrintLabel(self):
self.pt_space_before = self.label_pt_space_before # set the point spacing
self.pt_space_after = self.label_pt_space_after
self.LabelColorRow(self.label_colour)
self.SetPrintFont(self.label_font)
self.col = 0
max_y = 0
for vtxt in self.label:
self.region = self.column[self.col+1] - self.column[self.col]
self.indent = self.column[self.col]
self.align = wx.ALIGN_LEFT
max_out = self.OutTextRegion(vtxt, True)
if max_out > max_y:
max_y = max_out
self.col = self.col + 1
self.DrawGridLine() # top line of label
self.y = max_y + self.label_space
def PrintHeader(self): # print the header array
if self.draw == False:
return
for val in self.parent.header:
self.SetPrintFont(val["Font"])
header_indent = val["Indent"] * self.pwidth
text = val["Text"]
htype = val["Type"]
if htype == "Date":
addtext = self.GetDate()
elif htype == "Date & Time":
addtext = self.GetDateTime()
else:
addtext = ""
self.OutTextPageWidth(text+addtext, self.pheader_margin, val["Align"], header_indent, True)
def PrintFooter(self): # print the header array
if self.draw == False:
return
footer_pos = self.parent.page_height * self.pheight - self.pfooter_margin + self.vertical_offset
for val in self.parent.footer:
self.SetPrintFont(val["Font"])
footer_indent = val["Indent"] * self.pwidth
text = val["Text"]
ftype = val["Type"]
if ftype == "Pageof":
addtext = "Page " + str(self.page) + " of " + str(self.total_pages)
elif ftype == "Page":
addtext = "Page " + str(self.page)
elif ftype == "Num":
addtext = str(self.page)
elif ftype == "Date":
addtext = self.GetDate()
elif ftype == "Date & Time":
addtext = self.GetDateTime()
else:
addtext = ""
self.OutTextPageWidth(text+addtext, footer_pos, val["Align"], footer_indent, True)
def LabelColorRow(self, colour):
brush = wx.Brush(colour, wx.SOLID)
self.DC.SetBrush(brush)
height = self.label_space + self.label_pt_space_before + self.label_pt_space_after
self.DC.DrawRectangle(self.column[0], self.y,
self.end_x-self.column[0]+1, height)
def ColourRowCells(self, height):
if self.draw == False:
return
col = 0
for colour in self.column_bgcolour:
cellcolour = self.GetCellColour(self.data_cnt, col)
if cellcolour is not None:
colour = cellcolour
brush = wx.Brush(colour, wx.SOLID)
self.DC.SetBrush(brush)
self.DC.SetPen(wx.Pen(wx.NamedColour('WHITE'), 0))
start_x = self.column[col]
width = self.column[col+1] - start_x + 2
self.DC.DrawRectangle(start_x, self.y, width, height)
col = col + 1
def PrintRow(self, row_val, draw = True, align = wx.ALIGN_LEFT):
self.SetPrintFont(self.text_font)
self.pt_space_before = self.text_pt_space_before # set the point spacing
self.pt_space_after = self.text_pt_space_after
self.col = 0
max_y = 0
for vtxt in row_val:
if not isinstance(vtxt,types.StringTypes):
vtxt = str(vtxt)
self.region = self.column[self.col+1] - self.column[self.col]
self.indent = self.column[self.col]
self.align = self.column_align[self.col]
fcolour = self.column_txtcolour[self.col] # set font colour
celltext = self.GetCellTextColour(self.data_cnt, self.col)
if celltext is not None:
fcolour = celltext # override the column colour
self.DC.SetTextForeground(fcolour)
max_out = self.OutTextRegion(vtxt, draw)
if max_out > max_y:
max_y = max_out
self.col = self.col + 1
return max_y
def GetCellColour(self, row, col): # check if custom colour defined for the cell background
try:
set = self.cell_colour[row]
except:
return None
try:
colour = set[col]
return colour
except:
return None
def GetCellTextColour(self, row, col): # check if custom colour defined for the cell text
try:
set = self.cell_text[row]
except:
return None
try:
colour = set[col]
return colour
except:
return None
def FinishDraw(self):
self.DrawGridLine() # draw last row line
self.DrawColumns() # draw all vertical lines
def DrawGridLine(self):
if self.draw == True \
and len(self.column) > 2: #supress grid lines if only one column
try:
size = self.row_line_size[self.data_cnt]
except:
size = self.row_def_line_size
try:
colour = self.row_line_colour[self.data_cnt]
except:
colour = self.row_def_line_colour
self.DC.SetPen(wx.Pen(colour, size))
y_out = self.y
# y_out = self.y + self.pt_space_before + self.pt_space_after # adjust for extra spacing
self.DC.DrawLine(self.column[0], y_out, self.end_x, y_out)
def DrawColumns(self):
if self.draw == True \
and len(self.column) > 2: #surpress grid line if only one column
col = 0
for val in self.column:
try:
size = self.column_line_size[col]
except:
size = self.column_def_line_size
try:
colour = self.column_line_colour[col]
except:
colour = self.column_def_line_colour
indent = val
self.DC.SetPen(wx.Pen(colour, size))
self.DC.DrawLine(indent, self.y_start, indent, self.y)
col = col + 1
def DrawText(self):
self.DoRefresh()
def DoDrawing(self, DC):
size = DC.GetSize()
self.DC = DC
DC.BeginDrawing()
self.DrawText()
DC.EndDrawing()
self.sizew = DC.MaxY()
self.sizeh = DC.MaxX()
class PrintTable:
def __init__(self, parentFrame=None):
self.data = []
self.set_column = []
self.label = []
self.header = []
self.footer = []
self.set_column_align = {}
self.set_column_bgcolour = {}
self.set_column_txtcolour = {}
self.set_cell_colour = {}
self.set_cell_text = {}
self.column_line_size = {}
self.column_line_colour = {}
self.row_line_size = {}
self.row_line_colour = {}
self.parentFrame = parentFrame
self.SetPreviewSize()
self.printData = wx.PrintData()
self.scale = 1.0
self.SetParms()
self.SetColors()
self.SetFonts()
self.TextSpacing()
self.SetPrinterOffset()
self.SetHeaderValue()
self.SetFooterValue()
self.SetMargins()
self.SetPortrait()
def SetPreviewSize(self, position = wx.Point(0, 0), size="Full"):
if size == "Full":
r = wx.GetClientDisplayRect()
self.preview_frame_size = r.GetSize()
self.preview_frame_pos = r.GetPosition()
else:
self.preview_frame_size = size
self.preview_frame_pos = position
def SetPaperId(self, paper):
self.printData.SetPaperId(paper)
def SetOrientation(self, orient):
self.printData.SetOrientation(orient)
def SetColors(self):
self.row_def_line_colour = wx.NamedColour('BLACK')
self.row_def_line_size = 1
self.column_def_line_colour = wx.NamedColour('BLACK')
self.column_def_line_size = 1
self.column_colour = wx.NamedColour('WHITE')
self.label_colour = wx.NamedColour('LIGHT GREY')
def SetFonts(self):
self.label_font = { "Name": self.default_font_name, "Size": 12, "Colour": [0, 0, 0], "Attr": [0, 0, 0] }
self.text_font = { "Name": self.default_font_name, "Size": 10, "Colour": [0, 0, 0], "Attr": [0, 0, 0] }
def TextSpacing(self):
self.label_pt_adj_before = 0 # point adjustment before and after the label text
self.label_pt_adj_after = 0
self.text_pt_adj_before = 0 # point adjustment before and after the row text
self.text_pt_adj_after = 0
def SetLabelSpacing(self, before, after): # method to set the label space adjustment
self.label_pt_adj_before = before
self.label_pt_adj_after = after
def SetRowSpacing(self, before, after): # method to set the row space adjustment
self.text_pt_adj_before = before
self.text_pt_adj_after = after
def SetPrinterOffset(self): # offset to adjust for printer
self.vertical_offset = -0.1
self.horizontal_offset = -0.1
def SetHeaderValue(self):
self.header_margin = 0.25
self.header_font = { "Name": self.default_font_name, "Size": 11, "Colour": [0, 0, 0], "Attr": [0, 0, 0] }
self.header_align = wx.ALIGN_CENTRE
self.header_indent = 0
self.header_type = "Text"
def SetFooterValue(self):
self.footer_margin = 0.7
self.footer_font = { "Name": self.default_font_name, "Size": 11, "Colour": [0, 0, 0], "Attr": [0, 0, 0] }
self.footer_align = wx.ALIGN_CENTRE
self.footer_indent = 0
self.footer_type = "Pageof"
def SetMargins(self):
self.left_margin = 0.5
self.right_margin = 0.5 # only used if no column sizes
self.top_margin = 0.8
self.bottom_margin = 1.0
self.cell_left_margin = 0.1
self.cell_right_margin = 0.1
def SetPortrait(self):
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -