vak
Ноя. 9, 2007 03:02:38
Подскажите как (на чем) лучше всего решить задачу печати документов для wxPython. Например счет или Торг12. Естественно требуются шаблоны документов с “шапкой”, табличной частью и пр. с возможностью простого сопровождения: т.е. легко шаблон изменить либо создать дополнительную форму документа. На мой взгляд встроенные возможности wxPython тут не подходят. Что может подойти? Как люди сейчас решают подобные задачи?
proDiva
Ноя. 9, 2007 08:26:05
Я для разных целей использую разные модули.
Если нужно печатать сплошной текст, я формирую обычный текстовый файл, а в wxPython есть предпросмотр и печать текстовых файлов.
Если нужно что-то крупнее с таблицей, то делаю html-файл, в wxPython есть возможность предпросмотра и печати и этого вида файлов.
Если же таблица очень сложна для html, то формирую xls-файл с помощью модуля pyExcelerator и открываю для печати уже во внешнем Excel или OpenOffice.
Если что-то из этих вариантов интересует, могу выложить примеры.
vak
Ноя. 9, 2007 13:29:21
proDiva
Я для разных целей использую разные модули.
Если нужно печатать сплошной текст, я формирую обычный текстовый файл, а в wxPython есть предпросмотр и печать текстовых файлов.
Если нужно что-то крупнее с таблицей, то делаю html-файл, в wxPython есть возможность предпросмотра и печати и этого вида файлов.
Если же таблица очень сложна для html, то формирую xls-файл с помощью модуля pyExcelerator и открываю для печати уже во внешнем Excel или OpenOffice.
Если что-то из этих вариантов интересует, могу выложить примеры.
Да, интересно бы посмотреть примеры, интерес представляют все три варианта. Сам недавно пробовал плоский файл через wxPython печатать - кое что не получилось.
proDiva
Ноя. 13, 2007 11:12:47
На работе была запарка, сейчас готовлю примеры всех способов. Подождите немного.
proDiva
Ноя. 13, 2007 11:58:32
Вот пример печати в формате html:
# -*- coding: cp1251 -*-
from wxPython.wx import *
from wxPython.grid import *
import wx.grid
import wx
import string
import datetime
import os
import wx.html as html
import wx.lib.wxpTag
if wx.Platform == ‘__WXMSW__’:
import wx.lib.iewin as iewin
html_file = ‘test.html’
class MyFrameHtml(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, -1, title,
size=(400, 300))
wind = wxSplitterWindow(self, -1)
pan1 = wxScrolledWindow(wind, -1)
pan1.SetScrollRate(10, 10)
pan2 = wxPanel(wind, -1)
wind.SetMinSize((400,300))
pan1.SetMinSize((400,270))
pan2.SetMinSize((400,30))
Font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)
wind.SplitHorizontally(pan1, pan2)
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
self.html = html.HtmlWindow(pan1, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE)
self.html.SetMinSize((400,300))
self.printer = html.HtmlEasyPrinting()
self.current = “”
self.btn1 = wx.Button(pan2, -1, “Печать”)
self.btn1.SetFont(Font)
self.btn2 = wx.Button(pan2, -1, “Закрыть”)
self.btn2.SetFont(Font)
EVT_BUTTON(self, self.btn1.GetId(), self.on_print)
EVT_BUTTON(self, self.btn2.GetId(), self.on_close)
pan1.SetSizer(sizer_1)
pan2.SetSizer(sizer_2)
sizer_1.Add(self.html, 0, wx.EXPAND)
sizer_2.Add(self.btn1, -1, wx.EXPAND)
sizer_2.Add(self.btn2, -1, wx.EXPAND)
def on_print(self, evt):
self.printer.GetPrintData().SetPaperId(wx.PAPER_LETTER)
self.printer.PrintFile(self.html.GetOpenedPage())
evt.Skip()
def on_close(self, evt):
self.Destroy()
evt.Skip()
class MyHTML:
def __init__(self):
self.one =
self.two =
def Form(self):
path = os.path.normpath(html_file)
in_file=open(path, ‘w’)
stroka = ‘'
shapka = ’'
konec = ‘'
shapka = ’''
<html>
<head>
<meta http-equiv=“Content-Language” content=“ru”>
<meta http-equiv=“Content-Type” content=“text/html; charset=windows-1251”>
</head>
<body>
<p align=“center”><b>ПРИМЕР ПЕЧАТИ</b>
<table border=“1” width=“100%”>
<tr>
<td width=“50%” align=“center”>Колонка</td>
<td width=“50%” align=“center”>Колонка</td>
</tr>'''
for i in range(len(self.one)):
stroka = stroka + ‘'’
<tr>
<td width=“50%” align=“center”>'''+self.one+'''</td>
<td width=“50%” align=“center”>'''+self.two+'''</td>
</tr>'''
konec = ‘'’
</table>
</body>
</html>'''
text = shapka + stroka + konec
in_file.write(text)
in_file.close()
return
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)
self.SetSize((400, 300))
font_1 = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)
self.window1 = wxSplitterWindow(self, -1, style=wxNO_BORDER)
self.panel1 = wxPanel(self.window1, -1)
self.panel2 = wxPanel(self.window1, -1)
self.prt = wxButton(self.panel2, -1, _(“Печать”))
self.prt.SetFont(font_1)
self.exit = wxButton(self.panel2, -1, _(“Выход”))
self.exit.SetFont(font_1)
self.grid1 = wxGrid(self.panel1, -1, size=(1, 1))
self.grid1.CreateGrid(100, 2)
self.grid1.SetRowLabelSize(40)
self.grid1.SetMinSize((550,450))
self.grid1.SetColLabelValue(0, _(“One”))
self.grid1.SetColSize(0,150)
self.grid1.SetColLabelValue(1, _(“Two”))
self.grid1.SetColSize(1,150)
EVT_BUTTON(self, self.prt.GetId(), self.on_print)
EVT_BUTTON(self, self.exit.GetId(), self.on_exit)
self.panel1.SetMinSize((550, 470))
self.panel2.SetMinSize((550, 30))
self.window1.SetMinSize((550, 500))
sizer = wxBoxSizer(wxVERTICAL)
sizer_1 = wxBoxSizer(wxVERTICAL)
sizer_2 = wxBoxSizer(wxHORIZONTAL)
sizer_2.AddMany([(self.prt, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(self.exit, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)])
sizer_1.AddMany([(5,5),
(self.grid1, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(5,5)])
self.panel1.SetSizer(sizer_1)
self.panel2.SetSizer(sizer_2)
self.window1.SplitHorizontally(self.panel1, self.panel2)
sizer.Add(self.window1, 1, wxALL|wxEXPAND, 0)
self.SetAutoLayout(True)
self.SetSizer(sizer)
self.Layout()
self.Centre()
def on_exit(self, event):
self.Destroy()
event.Skip()
def on_print(self, event):
html = MyFrameHtml(None, ‘Печать’)
my = MyHTML()
tbl = self.grid1.GetTable()
for i in range(tbl.GetNumberRows()):
if tbl.GetValue(i, 0) != '':
my.one.append(str(tbl.GetValue(i,0)))
my.two.append(str(tbl.GetValue(i,1)))
else:
break
my.Form()
html.current = html_file
html.html.LoadPage(html.current)
html.Show()
event.Skip()
class MyApp(wx.App):
def OnInit(self):
wxInitAllImageHandlers()
frame = MyFrame(None, -1, “Пример”)
self.SetTopWindow(frame)
frame.Show()
return 1
if __name__ == “__main__”:
import gettext
gettext.install(“app”)
app = MyApp(redirect=True)
app.MainLoop()
proDiva
Ноя. 13, 2007 15:21:39
Вот пример с использованием формата xls:
# -*- coding: cp1251 -*-
from wxPython.wx import *
from wxPython.grid import *
import wx.grid
import wx
import string
import os
from pyExcelerator import *
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)
self.SetSize((400, 300))
font_1 = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)
self.window1 = wxSplitterWindow(self, -1, style=wxNO_BORDER)
self.panel1 = wxPanel(self.window1, -1)
self.panel2 = wxPanel(self.window1, -1)
self.prt = wxButton(self.panel2, -1, _(“Печать”))
self.prt.SetFont(font_1)
self.exit = wxButton(self.panel2, -1, _(“Выход”))
self.exit.SetFont(font_1)
self.grid1 = wxGrid(self.panel1, -1, size=(1, 1))
self.grid1.CreateGrid(100, 2)
self.grid1.SetRowLabelSize(40)
self.grid1.SetMinSize((550,450))
self.grid1.SetColLabelValue(0, _(“One”))
self.grid1.SetColSize(0,150)
self.grid1.SetColLabelValue(1, _(“Two”))
self.grid1.SetColSize(1,150)
EVT_BUTTON(self, self.prt.GetId(), self.on_print)
EVT_BUTTON(self, self.exit.GetId(), self.on_exit)
self.panel1.SetMinSize((550, 470))
self.panel2.SetMinSize((550, 30))
self.window1.SetMinSize((550, 500))
sizer = wxBoxSizer(wxVERTICAL)
sizer_1 = wxBoxSizer(wxVERTICAL)
sizer_2 = wxBoxSizer(wxHORIZONTAL)
sizer_2.AddMany([(self.prt, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(self.exit, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)])
sizer_1.AddMany([(5,5),
(self.grid1, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(5,5)])
self.panel1.SetSizer(sizer_1)
self.panel2.SetSizer(sizer_2)
self.window1.SplitHorizontally(self.panel1, self.panel2)
sizer.Add(self.window1, 1, wxALL|wxEXPAND, 0)
self.SetAutoLayout(True)
self.SetSizer(sizer)
self.Layout()
self.Centre()
def on_exit(self, event):
self.Destroy()
event.Skip()
def on_print(self, event):
tb = self.grid1.GetTable()
w = Workbook()
ws = w.add_sheet('test')
fnt1 = Font() # главный заголовок
fnt1.name = ‘Roman’
fnt1.height = 240
fnt2 = Font() # основной текст
fnt2.name = ‘Roman’
fnt2.height = 200
fnt3 = Font() # основной жирный
fnt3.name = ‘Roman’
fnt3.height = 200
fnt3.bold = True
fnt4 = Font() # маленький
fnt4.name = ‘Roman’
fnt4.height = 160
bor1 = Borders() # подчеркивание
bor1.bottom = 1
bor2 = Borders() # рамка
bor2.bottom = 1
bor2.top = 1
bor2.left = 1
bor2.right = 1
al1 = Alignment() # по центру с переносом слов
al1.horz = Alignment.HORZ_CENTER
al1.vert = Alignment.VERT_TOP
al1.wrap = True
al2 = Alignment()
al2.horz = Alignment.HORZ_JUSTIFIED
al2.vert = Alignment.VERT_TOP
style1 = XFStyle() # заголовок
style1.font = fnt1
style1.alignment = al1
style2 = XFStyle() # основной текст без рамок
style2.font = fnt2
style3 = XFStyle() # основной текст с подчеркиванием
style3.font = fnt2
style3.borders = bor1
style3.alignment = al1
style4 = XFStyle() # основной жирный с подчеркиванием
style4.font = fnt3
style4.alignment = al1
style4.borders = bor1
style5 = XFStyle() # заголовок в рамке
style5.font = fnt3
style5.alignment = al1
style5.borders = bor2
style6 = XFStyle() # основной текст в рамке с переносом слов
style6.font = fnt2
style6.alignment = al2
style6.borders = bor2
style7 = XFStyle() # основной маленький текст без рамок
style7.font = fnt4
style7.alignment = al1
ws.write_merge(0, 0, 0, 4, ‘Лучший форум по питону на Python.com.ua!’, style1)
for i in range(tb.GetNumberRows()):
if tb.GetValue(i, 0) != ‘':
ws.write(1+i, 0, tb.GetValue(i, 0), style3)
ws.write(1+i, 1, tb.GetValue(i, 1), style4)
else:
break
for j in range(0, 4):
ws.col(j).width = 3000
#ws.portrait = False
ws.header_str = ’'
ws.footer_str = ‘'
w.save(’test.xls')
path = os.path.normpath('test.xls')
os.startfile(path)
event.Skip()
class MyApp(wx.App):
def OnInit(self):
wxInitAllImageHandlers()
frame = MyFrame(None, -1, “Пример”)
self.SetTopWindow(frame)
frame.Show()
return 1
if __name__ == “__main__”:
import gettext
gettext.install(“app”)
app = MyApp(redirect=True)
app.MainLoop()
vak
Ноя. 13, 2007 16:41:47
Ок, спасибо. Буду смотреть - может вопросы возникнут.
А печать сплошного текста? есть пример?
proDiva
Ноя. 14, 2007 09:23:01
vak
А печать сплошного текста? есть пример?
Был хороший пример….. удалила, теперь нужно снова сочинять))