我有一个带有几个不同面板的框架,每个面板都应该得到相同的背景图像。所以我找到了这个例子:http://www.blog.pythonlibrary.org/2010/03/18/wxpython-putting-a-background-image-on-a-panel/ 我从这个例子中复制了“def OnEraseBackground(self,evt)”并将它绑定到EVT_ERASE_BACKGROUND。结果:面板重新绘制背景图像,颜色为灰色。我的背景图像具有相同的宽度,但它高于面板。所以在这里您可以看到面板重新绘制图像:http://s14.directupload.net/file/d/3030/ej22mwbx_jpg.htm(绿色底部是我图像的一部分;灰色矩形是我的面板)。 我还将这些行添加到了__init __:
import wx
class MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Click Kick",size=(1124,750),pos=((wx.DisplaySize()[0]-1024)/2,10))
self.startpanel = wx.Panel(self,size=(1024,600))
self.hideallpanels()
self.startpanel.Show()
#...
wx.StaticText(self.startpanel,-1,'Testtext',pos=(120,220))
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.sizer = wx.BoxSizer(wx.VERTICAL)
#self.sizer.Add(self.panelnewgame, 1, wx.EXPAND)
#self.sizer.Add(self.panelloadgame, 1, wx.EXPAND)
self.SetSizer(self.sizer)
#hSizer = wx.BoxSizer(wx.HORIZONTAL)
#hSizer.Add((1,1), 1, wx.EXPAND)
#hSizer.Add(self.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 hideallpanels(self):
self.startpanel.Hide()
#...
def OnEraseBackground(self, evt):
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
bmp = wx.Bitmap("background.bmp")
dc.DrawBitmap(bmp, 0, 0)
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()
但是使用这些行我无法启动程序:没有错误消息,但它只是不启动。
编辑: 调整窗口大小时,无需调整背景图像(或其他内容)的大小。窗口是静态的,不应该调整大小。
Edit2:我使用可能相关的所有代码更新了上面的代码示例。
Edit3:抱歉,但现在它运行了。你只需要一个名为“background.bmp”的背景图片,它应该大于wx.Panel(或者你减小了wx.Panel的大小) - >只是看,面板重新绘制图像。
答案 0 :(得分:2)
问题是育儿问题。如果你看看tutorial的剩余部分,你会注意到我将EVT_ERASE_BACKGROUND绑定到面板,而不是框架。此外,OnEraseBackground处理程序正在更新面板,而不是框架,因此您需要更改几行:
class MyForm(wx.Frame):
def __init__(self):
...
# change the last line in the init
self.startpanel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
def OnEraseBackground(self, evt):
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
# change this line too!!
rect = self.startpanel.GetUpdateRegion().GetBox()
您可能希望使用框架的SetSizeHints方法来设置最大和最小调整大小限制。否则,当您调整大于图像的帧大小时,您将在边框上看到灰色。