画像ファイルをタイル状に敷き詰める(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メソッドで背景をクリアするらしいが、なぜ必要なのかよく分からん...。