2013-04-07 251 views
1

我想绘制一个背景图片和一些较小的图片(在前景)。据我了解,首先画的照片会成为前景,如果我在同一位置画第二张照片,那么它会在背景中。我的问题是,必须在开始和之后(在某个事件中)绘制背景图片,并在该背景图片的顶部绘制前景图片。 我的不良解决方案:销毁第一张(背景)图片并重新绘制。问题:图片闪烁。那么有没有更好的解决方案? 这里是一些代码:设置图片为背景

def drawBG(self):  
    self.picBG = wx.StaticBitmap(self,size=(1020,252),pos=(0,160)) 
    self.picBG.SetBitmap(wx.Bitmap(path)) 

def drawFG(self,event): 
    self.picFG = wx.StaticBitmap(self,size=(80,80),pos=(500,180)) 
    self.picFG.SetBitmap(wx.Bitmap(path)) 
    self.picBG.Destroy() 
    self.drawBG() 

回答

1

你可以在面板上设置背景图片,然后使用wx.StaticBitmap部件把其他图像在它上面。我写了一篇关于如何把一个背景图片上wx.Panel教程:http://www.blog.pythonlibrary.org/2010/03/18/wxpython-putting-a-background-image-on-a-panel/

下面是从我的教程代码:

import wx 

######################################################################## 
class MainPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 
     self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 
     self.frame = parent 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     hSizer = wx.BoxSizer(wx.HORIZONTAL) 

     for num in range(4): 
      label = "Button %s" % num 
      btn = wx.Button(self, label=label) 
      sizer.Add(btn, 0, wx.ALL, 5) 
     hSizer.Add((1,1), 1, wx.EXPAND) 
     hSizer.Add(sizer, 0, wx.TOP, 100) 
     hSizer.Add((1,1), 0, wx.ALL, 75) 
     self.SetSizer(hSizer) 
     self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 

    #---------------------------------------------------------------------- 
    def OnEraseBackground(self, evt): 
     """ 
     Add a picture to the background 
     """ 
     # yanked from ColourDB.py 
     dc = evt.GetDC() 

     if not dc: 
      dc = wx.ClientDC(self) 
      rect = self.GetUpdateRegion().GetBox() 
      dc.SetClippingRect(rect) 
     dc.Clear() 
     bmp = wx.Bitmap("butterfly.jpg") 
     dc.DrawBitmap(bmp, 0, 0) 


######################################################################## 
class MainFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, size=(600,450)) 
     panel = MainPanel(self)   
     self.Center() 

######################################################################## 
class Main(wx.App): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, redirect=False, filename=None): 
     """Constructor""" 
     wx.App.__init__(self, redirect, filename) 
     dlg = MainFrame() 
     dlg.Show() 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = Main() 
    app.MainLoop() 

现在你只需要交换的按钮出来StaticBitmap部件。