python学习笔记之wxpython打印预览

主要学习wxPython in action 和Demo程序,做点学习笔记

wxPython 通过使用设备上下文和绘制操作来实现打印,wxPython中实现打印的一个重要的类:wx.PrintOut它管理实际的图片部分。打印输出实例可以由一个代表打印机的wx.Printer对象或用于打印预览的wx.PrintPreview对象来管理。下面我介绍一下打印预览。

一,创建wx.PrintOut的子类,覆盖wx.PrintOut的方法以定义自己的打印行为。wx.PrintOut有多个个可以覆盖以自定义打印行为的方法,这些方法会被自动触发,然后通常不需要覆盖所有的方法。下面分析一下wxPython Demo中的类子来说明各个方法。

class MyPrintout(wx.Printout):
    def __init__(self, canvas, log):
        wx.Printout.__init__(self)
        self.canvas = canvas
        self.log = log
    def OnBeginDocument(self, start, end):#其中参数start、end告诉wxPython打印的起始页和最后一页。
        self.log.WriteText("MyPrintout.OnBeginDocument\n")#做你自己想做的操作
        return super(MyPrintout, self).OnBeginDocument(start, end)#必须调用父类的方法,因为父类的方法要做一些重要的工作

    def OnEndDocument(self):#文档副本打印结束后,被触发。
        self.log.WriteText("MyPrintout.OnEndDocument\n")
        super(MyPrintout, self).OnEndDocument()#同样必须调用父类的方法

    def OnBeginPrinting(self):#一般情况不需要重载该方法
        self.log.WriteText("MyPrintout.OnBeginPrinting\n")
        super(MyPrintout, self).OnBeginPrinting()

    def OnEndPrinting(self):#当副本打印完成后,该方法被调用,以结束打印
        self.log.WriteText("MyPrintout.OnEndPrinting\n")
        super(MyPrintout, self).OnEndPrinting()

    def OnPreparePrinting(self):#通常用于打印之前的一些计算,如计算有多少页
        self.log.WriteText("MyPrintout.OnPreparePrinting\n")
        super(MyPrintout, self).OnPreparePrinting()

    def HasPage(self, page):#该方法通常需要覆盖,它被打印框架用于循环控制,如果参数page存在文档的范围内,返回True,否则返回False
        self.log.WriteText("MyPrintout.HasPage: %d\n" % page)
        if page <= 2:
            return True
        else:
            return False

    def GetPageInfo(self):#获得文档的页数信息
        self.log.WriteText("MyPrintout.GetPageInfo\n")
        return (1, 2, 1, 2)

    def OnPrintPage(self, page):#实际的打印操作
        self.log.WriteText("MyPrintout.OnPrintPage: %d\n" % page)
        dc = self.GetDC()
        ...
        return True
二、实现打印预览
第一步:创建预览实例

wx.PrintPreview(printout,printoutForPrinting,data=None)

参数:printout是wx.PrintOut对象,用于管理预览;

      pintoutForPrinting也是wx.PrintOut对象,如果不为None,那么现实打印预览的时候窗口包含一个Print按钮,该按钮启动打印,该参数用于实际的打印。

      data是一个wx.PrintData对象或wx.PrintDialogData对象。如果参数指定,那么他被用于控制该打印预览。

第二步:创建预览框架

有了wx.PrintPreview,就需要一个框架显示wx.PrintPreview.

wx.PreviewFrame(preView,parent,title,pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.DEFAULT_FRAME_STYLE,name='frame')

preView就是要预览的实例

第三步:初始化框架

在你显示你的wx.PreviewFrame之前,你需要调用Initialize()方法,该方法创建窗口的内部的部件并做其它的内部的计算。

下面实现一个简单的打印位图的功能,在前面视频截获的基础上:

# -*- coding: utf-8 -*- 
import wx
import wx.xrc
import VideoCapture
###########################################################################
## Class MyFrame1
###########################################################################
class MyFrame1 ( wx.Frame ):
    
    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 566,535 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
        
        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
        
        bSizer1 = wx.BoxSizer( wx.VERTICAL )
        
        self.m_panel1 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        bSizer1.Add( self.m_panel1, 1, wx.EXPAND |wx.ALL, 5 )
        
        self.m_button3 = wx.Button( self, wx.ID_ANY, u"视频捕获", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_button4 = wx.Button( self, wx.ID_ANY, u"打印预览", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.m_button3, 0, wx.ALL, 5 )
        bSizer1.Add( self.m_button4, 0, wx.ALL, 5 )
        
        self.SetSizer( bSizer1 )
        self.Layout()
        
        self.Centre( wx.BOTH )
        # Connect Events
        self.m_button3.Bind( wx.EVT_BUTTON, self.OnButton )
        self.m_button4.Bind( wx.EVT_BUTTON, self.OnButton2 )
        self.timer=wx.Timer(self)
        self.Bind(wx.EVT_TIMER,self.OnIdel,self.timer)
        self.Bind(wx.EVT_CLOSE,self.OnExit)
    def OnExit(self,evnet):
        self.timer.Stop()
        wx.Exit() 
        pass
    def OnIdel(self,evnet):
        cam = VideoCapture.Device()
        self.cam.saveSnapshot('test.jpg')
        img=wx.Image("test.jpg",wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        dc=wx.ClientDC(self.m_panel1)
        dc.DrawBitmap(img,0,0,False)
    def OnButton( self, event ):
        self.cam = VideoCapture.Device()
        #cam.saveSnapshot('test.jpg')
        self.timer.Start(100)
    def OnButton2( self, event ):
        self.timer.Stop()
        self.printData = wx.PrintData()
        self.printData.SetPaperId(wx.PAPER_LETTER)
        self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER)
        data = wx.PrintDialogData(self.printData)
        printout = MyPrintout(self)
        printout2 = MyPrintout(self)
        self.preview = wx.PrintPreview(printout, printout2, data)#第一步创建预览设备
        if not self.preview.Ok():
            wx.MessageBox("error")
            return
        pfrm = wx.PreviewFrame(self.preview, self, "This is a print preview")#第二步创建框架
        pfrm.Initialize()#第三步初始化框架
        pfrm.SetPosition(self.GetPosition())#设置默认的位置
        pfrm.SetSize(self.GetSize())#设置打印预览框的大小
        pfrm.Show(True)
    
class MyPrintout(wx.Printout):
    def __init__(self, canvas):
        wx.Printout.__init__(self)
        self.canvas = canvas

    def OnBeginDocument(self, start, end):
        return super(MyPrintout, self).OnBeginDocument(start, end)

    def OnEndDocument(self):
        super(MyPrintout, self).OnEndDocument()

    def OnBeginPrinting(self):
        super(MyPrintout, self).OnBeginPrinting()

    def OnEndPrinting(self):
        super(MyPrintout, self).OnEndPrinting()

    def OnPreparePrinting(self):
        super(MyPrintout, self).OnPreparePrinting()

    def OnPrintPage(self, page):
        dc = self.GetDC()
        #-------------------------------------------
        # One possible method of setting scaling factors...
        img=wx.Image("test.jpg",wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        dc.DrawBitmap(img,0,0,False)
        return True
if __name__=='__main__':
    app=wx.App()
    frame=MyFrame1(None)
    frame.Show(True)
    app.MainLoop()
效果如图:






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值