1)目前遇到一个问题,就是wxpython显示一个图片,然后可以在图片上画矩形,点,line,circle and so
on,最后保存矩形的坐标.但是现在可以在屏幕上画矩形,无法在图片上做标记,我反思的原因是:如果要画图型,一定要创建一个dc对象,不管是memorydc
or clientdc,这个对象都是以整个屏幕为基础的。而如果要显示一张图片的话,一定是要把图片转换成bitmap类型,然后再转成静态bitmap,也就是staticbitmap类型,和一个静态文本类似,staticbitmap存储的是每一个像素的坐标和像素值,相当于一个数组。
总结来讲,就是觉得wxpython 的
dc的功能或许是自己还没有理解,或许是根本没考虑到动态做label,觉得dc无法实现在一个静态文件上动态画图。
目前整个逻辑我想不通,目前还没有实现,在stackoverflow上搜了一下,baidu
so了一下,也没有人解释。mark一下,dc的概念。
dc
:要在屏幕上绘画,我们要用到一个名为device context(设备上下文)的wxPython对象。设备上下文代表抽象的设备,它对于所有的设备有一套公用的绘画方法
(1)在图片上画好矩形或者文本,然后将图片显示出来
注意:MemoryDC works on a Bitmap, not a StaticBitmap
control.
http://stackoverflow.com/questions/20287152/wxpython-draw-text-onto-existing-bitmap-or-image
代码如下:
bitmap = wx.Bitmap(location)
dc = wx.MemoryDC(bitmap)
text = 'whatever'
w, h = dc.GetSize()
tw, th = dc.GetTextExtent(text)
dc.DrawText(text, (w - tw) / 2, (h - th) / 2) #display
text in center del dc control = wx.StaticBitmap(self, -1,
bitmap)
(2)wx.MemoryDC:用于绘制图形到内存中的一个位图中,此时不被显示。然后你可以选择该位图,并使用wx.DC.Blit()方法来把这个位图绘画到一个窗口中。
http://stackoverflow.com/questions/11786103/wxpython-drawing-on-a-staticbitmap
def Draw(self, e):
img =
wx.Image("./poster/Test2.png",
wx.BITMAP_TYPE_ANY)
bit =
wx.EmptyBitmap(517,524)
imgBit =
wx.BitmapFromImage(img)
dc =
wx.MemoryDC(imgBit)
dc.SetPen(wx.Pen(wx.RED,
1))
dc.DrawLines(((83, 375),
(83, 42), (120, 42), (120,375), (83,375)))
dc.SelectObject(wx.NullBitmap)# I didn't know I had to deselect the
DC self.imageCtrl.SetBitmap(imgBit)
imgBit.SaveFile("bit.bmp",
wx.BITMAP_TYPE_BMP)
我已经知道了需要对图片做什么操作,在不显示图片的情况下预定义操作,然后保存图片,图片上有相应的矩形。
(3)wxmemory两个主要函数:dc=wxmemory()
dc.SelectObject(self, bitmap)
http://wxpython.org/docs/api/wx.MemoryDC-class.html
(4)给panel控件设置一个backgroundimage
#coding:utf-8
import wx
#导入wxformbuilder生成的代码
import BgDemo
class Main(wx.App):
def __init__(self,
redirect=False, filename=None):
wx.App.__init__(self, redirect,
filename)
dlg = BgDemo.MyFrame(None)
dlg.m_panel1.Bind(wx.EVT_ERASE_BACKGROUND,
self.OnEraseBackground)
dlg.Show()
def
OnEraseBackground(self, evt):
dc = evt.GetDC()
if not dc:
dc =
wx.ClientDC(self)
rect =
self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
bmp = wx.Bitmap("Sunset.jpg")
dc.DrawBitmap(bmp, 0, 0)
from:http://www.111cn.net/phper/python/59761.htm
(5)