wxPython支持四种和位图相关的类:wx.Bitmap, wx.Icon, wx.Cursor和wx.Image。wx.Bitmap是一个平台有关的类,它拥有一个可选的wx.Mask属性以支持透明绘画。wx.Icon用来实现各个平台上的图标,一个图标指的是一个小的透明图片,可以用来代表不同的frame或者对话框窗口。wx.Cursor则是一个用来展示鼠标指针的图像。wx.Image则是四个类中唯一的一个平台无关的实现,它支持24bit位图以及可选的alpha通道。
一、wx.Bitmap
wx.Bitmap类封装了和平台相关位图的概念,它可以是单色图像,也可以是支持alpha通道的彩色图像。
我们可以使用wx.Bitmap来做以下事情:
- 通过设备上下文将其画在一个窗口上。
- 在某些类(比如wx.BitmapButton, wx.StaticBitmap, 和wx.ToolBar)中将其作为一个图片标签。
- 使用其作为双缓冲区(在将某个图形绘制到屏幕上之前先绘制在一块缓冲区上)。
wx.Bitmap的常用方法:
- ConvertToImage(self):转换成一个wx.Image,保留透明部分。
- CopyFromIcon(self, icon):从一个wx.Icon创建一个wx.Bitmap。
- Create (self, width, height, depth=BITMAP_SCREEN_DEPTH):从图片数据或者一个给定的大小创建一个bitmap。
- GetWidth(self):以物理像素为单位返回位图的宽度。
- GetHeight(self):以物理像素为单位返回位图的高度。
- GetSize(self):以物理像素为单位返回位图的大小。
- GetDepth(self):返回位图的颜色深度。
- GetSubBitmap(self, rect):只要rect完全属于当前位图,则返回当前位图的子位图。
- GetMask(self):获取相关的掩码(如果有),该掩码可能已从文件加载或为位图设置。
- SetMask(self, mask):设置位图的掩码。
- LoadFile(self, name, type=BITMAP_TYPE_ANY, desiredWidth=-1, desiredHeight=-1):从文件或资源中加载图标。
- SaveFile(self, name, type, palette=None):使用指定的文件名保存位图。
#位图演示
import wx
class SampleBitmap(wx.Frame):
def __init__(self, *args, **kw):
super(SampleBitmap, self).__init__(*args, **kw)
self.InitUi()
def InitUi(self):
self.SetTitle("实战wxPython: 位图")
self.SetSize(400, 300)
#self.SetIcon(wx.Icon("python-logo.png", wx.BITMAP_TYPE_ANY))
self.isOff = True
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
self.bmps = [wx.Bitmap("light_off.png", wx.BITMAP_TYPE_PNG),
wx.Bitmap("light_on.png", wx.BITMAP_TYPE_PNG)]
self.image = wx.StaticBitmap(panel, wx.ID_ANY, self.bmps[0])
btnSwitch = wx.Button(panel, wx.ID_ANY, label="切换")
btnSwitch.Bind(wx.EVT_BUTTON, self.OnSwitch)
vbox.Add(self.image, 1, wx.CENTER|wx.ALL)
vbox.Add(btnSwitch, 0, wx.CENTER|wx.ALL)
panel.SetSizer(vbox)
self.Centre()
def OnSwitch(self, e):
id = e.GetId()
if self.isOff:
self.image.SetBitmap(self.bmps[1])
self.isOff = False
else:
self.image.SetBitmap(self.bmps[0])
self.isOff = True
def main():
app = wx.App()
sample = SampleBitmap(None)
sample.Show()
app.MainLoop()
if __name__ == "__main__":
main()
图1:wx.Bitmap演示
上面的代码演示了使用wx.Bitmap作为wx.StaticBitmap位图,当我们点击切换按钮时,wx.StaticBitmap的图标将在两个位图之间切换。
二、wx.Icon
wx.Icon图标是一个小的矩形位图,通常用于表示一个最小化的应用程序。它与wx.Bitmap的不同之处在于总是有一个与它相关联的掩码用于透明绘制。在一些平台上,图标和位图的实现是相同的,因为带掩码的wx.Bitmap和图标之间没有真正的区别;在某些平台上没有特定的图标格式(基于x的应用程序通常在xpm上对小位图和图标进行标准化)。但是,一些平台(如Windows)会做出区分,因此提供了一个单独的类。
wx.Icon图标的用途包括:
- 设置wx.Frame窗口或者对话框的图标。
- 通过wx.ImageList类给wx.TreeCtrl, wx.ListCtrl或者wx.Notebook提供图标。
- 使用wx.DC.DrawIcon函数在设备上下文中绘制一个图标。
wx.Icon的常用方法:
- CopyFromBitmap(self, bmp):将bmp位图复制到此图标。在MS Windows下,位图必须设置掩码颜色。
- GetWidth(self):以物理像素为单位返回位图的宽度。
- GetHeight(self):以物理像素为单位返回位图的高度。
- GetSize(self):以物理像素为单位返回位图的大小。
- GetDepth(self):返回位图的颜色深度。
- LoadFile(self, name, type=BITMAP_TYPE_ANY, desiredWidth=-1, desiredHeight=-1):从文件或资源中加载图标。
在前面的例子中,我们可以给主窗口添加一个图标
#self.SetIcon(wx.Icon("python-logo.png", wx.BITMAP_TYPE_ANY))
去掉上面的注释,在运行程序,可以看到窗口左上角的图标已更换成我们设置的图标。
图2:wx.Icon演示
三、wx.Cusor
光标用来指示鼠标指针当前的位置。可以给某个窗口指定不同的光标以便提示用户这个窗口期待某种类型的鼠标操作。和图标一样,光标也是一种始终带有透明遮罩的小图片,可以使用一般的构造函数或者是平台相关的构造函数来创建。其中的一些构造函数还需要相对于整个图片的左上角指定一个热点位置,当鼠标点击的时候,热点所在的位置将作为鼠标点击的位置。
wxPython系统提供的光标标识符:
- wx.CURSOR_ARROW:默认光标(即箭头向左)。
- wx.CURSOR_RIGHT_ARROW:箭头向右。
- wx.CURSOR_BLANK:透明光标/无光标。
- wx.CURSOR_BULLSEYE:圆心。
- wx.CURSOR_CROSS:十字。
- wx.CURSOR_HAND:手指向上。
- wx.CURSOR_IBEAM :文本编辑光标。
- wx.CURSOR_MAGNIFIER:放大镜。
- wx.CURSOR_NO_ENTRY :禁止进入。
- wx.CURSOR_PAINT_BRUSH :画刷。
- wx.CURSOR_PENCIL:铅笔。
- wx.CURSOR_POINT_LEFT:手指向左。
- wx.CURSOR_POINT_RIGHT:手指向右。
- wxCURSOR_QUESTION_ARROW:带问号的箭头。
- wx.CURSOR_SIZENESW:东北到西南伸缩。
- wx.CURSOR_SIZENS:上下伸缩。
- wx.CURSOR_SIZENWSE:西北到东南伸缩。
- wx.CURSOR_SIZEWE:左右伸缩。
- wx.CURSOR_SIZING:移动。
- wx.CURSOR_WAIT:等待。
- wx.CURSOR_ARROWWAIT:后台忙。
图3:系统内建鼠标样式
四、wx.Image
wx.Image是一个平台无关的实现,它支持24bit位图以及可选的alpha通道。wx.Image可以从 wx.Bitmap类使用wx.Bitmap.ConvertToImage函数转换而来,也可以从各种各样的图片文件中加载,它所支持的图片格式也是可以通过图片格式处理器来扩展的。它拥有操作其图片上某些bit的能力,因此也可以用来对图片进行一个基本的操作。和wx.Bitmap不同,wx.Image不可以直接被设备上下文wx.DC使用,如果要在wx.DC上绘图,需要将wx.Image转换成wx.Bitmap,然后就可以使用wx.DC的 DrawBitmap函数进行绘图了。wx.Image支持设置一个掩码颜色来实现透明的效果,也支持通过alpha通道实现非常复杂的透明效果。
wx.Image常用方法:
- wx.Image(name, type=wx.BITMAP_TYPE_ANY):参数name是图像文件的名字,参数type是处理器类型,表示要读取图像的类型。如果type是wx.BITMAP_TYPE_ANY,那么wxPython将试图自动检测该文件的类型。
- wx.Image(width, height, clear=True):生成指定大小的空图像。clear=True代表图像背景为黑色。
- ConvertToBitmap(self, depth=-1):将图像转换为wx.Bitmap。
- ConvertAlphaToMask(self, *args, **kw):如果图像有alpha通道,此方法将其转换为蒙版。
- ConvertToGreyscale(self, *args, **kw):返回图像的单色图。
- GetSubImage(self, rect):返回当前图像的一个子图像,只要rect完全属于该图像。
- GetWidth(self):以物理像素为单位返回位图的宽度。
- GetHeight(self):以物理像素为单位返回位图的高度。
- LoadFile(self, *args, **kw):从输入流加载图像。
- SaveFile(self, *args, **kw):将给定流中保存为图像。
- Scale(self, width, height, quality=IMAGE_QUALITY_NORMAL):返回缩放的图像。
- Rescale(self, width, height, quality=IMAGE_QUALITY_NORMAL):通过缩放来改变图像的大小:调用此函数后,图像将具有给定的宽度和高度。
- Resize(self, size, pos, red=-1, green=-1, blue=-1):通过添加给定颜色的边框或根据需要进行裁剪,在不缩放的情况下就地更改图像的大小。
- Rotate(self, angle, rotationCentre, interpolating=True, offsetAfterRotation=None):以弧度角度旋转给定点的图像。
- Rotate180(self):返回旋转180度的图像副本。
- Rotate90(self, clockwise=True):返回按顺时针/反时针方向旋转90度的图像副本。
- Mirror(self, horizontally=True):返回图像的镜像副本。
三、本文知识点
- 了解和使用wx.Bitmap。
- 了解和使用wx.Icon。
- 了解wx.Cursor。
- 了解wx.Image。