画像ファイルをタイル状に敷き詰める(DragImage2.py)
次は、一つの画像ファイルをタイルのように画面に敷き詰める方法を試す。
デモの中でDragImage.pyを見つけた。これはまさにやりたいことを含んでいるので、不要な部分を削ぎ落としてゆくことにする。
その結果が次のソース DragImage2.py。
import wx import images class DragCanvas(wx.ScrolledWindow): def __init__(self, parent, ID): wx.ScrolledWindow.__init__(self, parent, ID) # self.bg_bmp = images.getBackgroundBitmap() self.bg_bmp = images.getTestStarBitmap() self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) # tile the background bitmap def TileBackground(self, dc): sz = self.GetClientSize() w = self.bg_bmp.GetWidth() h = self.bg_bmp.GetHeight() x = 0 while x < sz.width: y = 0 while y < sz.height: dc.DrawBitmap(self.bg_bmp, x, y) y = y + h x = x + w def OnEraseBackground(self, evt): dc = evt.GetDC() if not dc: dc = wx.ClientDC(self) rect = self.GetUpdateRegion().GetBox() dc.SetClippingRect(rect) self.TileBackground(dc) def runTest(frame, nb, log): win = wx.Panel(nb, -1) canvas = DragCanvas(win, -1) def onSize(evt, panel=win, canvas=canvas): canvas.SetSize(panel.GetSize()) win.Bind(wx.EVT_SIZE, onSize) return win if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
やる事は単純なのに結構長い。これ以上どこかを削るとエラーになるので、短くできなかった。
OnEraseBackgroundメソッドで背景をクリアするらしいが、なぜ必要なのかよく分からん...。