2013-04-07 3 views
1

Я хочу нарисовать одно фоновое изображение и некоторые более мелкие изображения поверх этого (на переднем плане). Насколько я понимаю, картина, которая сначала нарисована, попадает на передний план, и если я рисую вторую картинку в том же положении, то она будет в фоновом режиме. Моя проблема заключается в том, что фоновое изображение должно быть нарисовано в начале и позже (при определенном событии) изображение переднего плана должно быть нарисовано поверх этого фонового изображения. Мое плохое решение: уничтожить первое (фоновое) изображение и перерисовать его. проблема: изображение мерцает. Так есть ли лучшее решение? здесь некоторый код:set picture as background

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.