#!/usr/bin/python import sys import Image import wx import wx.aui import operator # import ImageWin # ImageSequence? imgs = [] def pilImage_to_wxBitmap(pilImage): """convert pil Image to wx Bitmap with Alpha""" # http://jehiah.cz/archive/pil-to-wxbitmap, except that # it gave me 0xff for alpha which was pointless... image = wx.EmptyImage(*pilImage.size) # RGB/RGBA are one byte per channel... image.SetData(pilImage.convert("RGB").tostring()) # image.SetAlphaData(pilImage.convert("RGBA").tostring()[3::4]) image.SetAlphaData(chr(128) * operator.mul(*pilImage.size)) # adjust? image.AdjustChannels(1.0,1.0,1.0,0.8) # DrawBitmap wants a bitmap... bitmap = wx.BitmapFromImage(image) return bitmap class TestPanel(wx.Panel): def __init__(self, parent, imgs): self.imgs = imgs self.bitmaps = [pilImage_to_wxBitmap(img) for img in self.imgs] wx.Panel.__init__(self, parent, -1) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_CHAR, self.OnChar) self.x_offset = [] self.y_offset = [] self.forward = True for offset in range(len(self.bitmaps)): self.x_offset.append(offset * 50) self.y_offset.append(offset * 50) def OnChar(self, evt): # needs focus... # wx.WXK_RETURN wxk = evt.GetKeyCode() if wxk == ord("q"): print zip(self.x_offset, self.y_offset) sys.exit() elif wxk == wx.WXK_UP: self.y_offset[1] -= 1 elif wxk == wx.WXK_DOWN: self.y_offset[1] += 1 elif wxk == wx.WXK_LEFT: self.x_offset[1] -= 1 elif wxk == wx.WXK_RIGHT: self.x_offset[1] += 1 elif wxk == ord(" "): self.forward = not self.forward else: print "key:", wxk self.OnPaint(None) def OnPaint(self, evt): pdc = wx.BufferedDC(wx.PaintDC(self)) # dc = wx.GCDC(pdc) if False: # paint a background to show the alpha manipulation pdc.SetBackground(wx.Brush("BLUE")) pdc.Clear() pdc.SetBrush(wx.Brush("WHITE", wx.CROSSDIAG_HATCH)) windowsize = self.GetSizeTuple() print windowsize pdc.DrawRectangle(0, 0, windowsize[0], windowsize[1]) else: pdc.SetBackground(wx.Brush("WHITE")) pdc.Clear() x_shift = min(self.x_offset) y_shift = min(self.y_offset) work = zip(self.x_offset, self.y_offset, self.bitmaps) if not self.forward: work.reverse() for x_offset, y_offset, bitmap in work: # handle clipping... pdc.DrawBitmap(bitmap, x_offset - x_shift, y_offset - y_shift, True) # penclr = wx.Colour(0, 0, 0, wx.ALPHA_OPAQUE) # brushclr = wx.Colour(0, 0, 0, 128) # half transparent # pdc.SetPen(wx.Pen(penclr)) # pdc.SetBrush(wx.Brush(brushclr)) # pdc.SetBackground(wx.Brush(brushclr)) # print dir(pdc) # pdc.SetBackgroundMode(wx.TRANSPARENT) def not_doing_this(self): rect = wx.Rect(0,0, 100, 100) for RGB, pos in [((178, 34, 34), ( 50, 90)), (( 35, 142, 35), (110, 150)), (( 0, 0, 139), (170, 90)) ]: r, g, b = RGB penclr = wx.Colour(r, g, b, wx.ALPHA_OPAQUE) brushclr = wx.Colour(r, g, b, 128) # half transparent dc.SetPen(wx.Pen(penclr)) dc.SetBrush(wx.Brush(brushclr)) rect.SetPosition(pos) dc.DrawRoundedRectangleRect(rect, 8) def display_blended(paths): global imgs imgs = [Image.open(path) for path in paths] #for img in imgs: # print img.mode wxstuff() # dib = ImageWin.Dib() # hwnd = ImageWin.HWND(widget.winfo_id()) # dib.draw(hwnd, xy) class MyApp(wx.App): def OnInit(self): self.frame = wx.Frame(None) # self.nb = wx.Notebook(self.frame, -1, style=wx.CLIP_CHILDREN) # print dir(self.frame) self.tp = TestPanel(self.frame, imgs) self.frame.Show() self.mgr = wx.aui.AuiManager() self.mgr.SetManagedWindow(self.frame) # self.mgr.AddPane(self.frame, wx.aui.AuiPaneInfo().CenterPane().Name("Notebook")) self.mgr.Update() self.tp.SetFocus() # otherwise we need a click to get it return True def wxstuff(): app = MyApp(False) app.MainLoop() if __name__ == "__main__": display_blended(sys.argv[1:]) # http://sandbox.manning.com/thread.jspa?messageID=59056 # >>> import wx # >>> frame = wx.GetTopLevelParent(shell) # >>> frame.SetTransparent(200) # returns false... # http://www.zetcode.com/wxpython/events/