当前位置: 首页 > news >正文

python 报表打印预览_python学习笔记之wxpython打印预览

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

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

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

[python]

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()方法,该方法创建窗口的内部的部件并做其它的内部的计算。

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

[python]

# -*- 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()#第三步初始化框架  http://www.2cto.com/

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()

效果如图:

29896677_2.png

作者:kkxgx

相关文章:

  • python动态规划算法最大k乘积_动态规划最大K乘积问题
  • python实现语音播放失败_PyAudio alsa错误消息
  • python更新pip管理员权限_PIP升级权限被拒绝Windows 10
  • redis监听mysql数据库数据_天兔监控服务器和mysql,redis等监控
  • 第二部分 Mysql数据库管理_第二篇 数据库MySql
  • mysql 从库基于主库binlog恢复_MySQL利用binlog来恢复数据库
  • python可迭代对象相关的内建函数_第八章 Python可迭代对象、迭代器和生成器
  • mysql workbench连接jsp_JSP连接sql server2000数据库
  • 爱可生 mysql监控_数据库Prometheus 数据采集3-爱可生
  • java分割_Java中分割字符串的两种方法实例详解
  • java https 证书_JavaHTTPS客户端证书认证
  • java byte to hex_java 转换byte位hex字符串的工具代码
  • java泛型设计_使用java泛型设计通用方法
  • java线程 数据队列_java多线程从队列中取出数据执行
  • java 给url增加参数_Java给指定URL字符串添加值和获取URL字符串中的参数值
  • Docker 笔记(2):Dockerfile
  • js学习笔记
  • LintCode 31. partitionArray 数组划分
  • ReactNativeweexDeviceOne对比
  • 创建一个Struts2项目maven 方式
  • 从输入URL到页面加载发生了什么
  • 回顾2016
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 嵌入式文件系统
  • 深度学习在携程攻略社区的应用
  • 通过几道题目学习二叉搜索树
  • 通信类
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • (C语言)球球大作战
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)setTimeout 和 setInterval 的区别
  • **PHP分步表单提交思路(分页表单提交)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core WebAPI中封装Swagger配置
  • .NET 读取 JSON格式的数据
  • .NET 反射的使用
  • .NET 解决重复提交问题
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET建议使用的大小写命名原则
  • .NET框架
  • .NET文档生成工具ADB使用图文教程
  • .NET业务框架的构建
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /etc/sudoer文件配置简析
  • ::前边啥也没有
  • @GlobalLock注解作用与原理解析
  • [20171106]配置客户端连接注意.txt
  • [22]. 括号生成