Wxpython 面板重新绘制背景图像(使用EVT_擦除_背景)
我有一个框架和几个不同的面板,每个面板将得到相同的背景图像。所以我发现了这个例子: 我从这个示例中复制了“def onerasebackup(self,evt)”并将其绑定到evt_ERASE_BACKGROUND。结果:面板用灰色重新绘制背景图像。我的背景图像具有相同的宽度,但高于面板。在这里,您可以看到面板重新绘制了图像:(绿色底部是我的图像的一部分;灰色矩形是我的面板)。 我还将这些行添加到我的_uinit__;中:Wxpython 面板重新绘制背景图像(使用EVT_擦除_背景),wxpython,Wxpython,我有一个框架和几个不同的面板,每个面板将得到相同的背景图像。所以我发现了这个例子: 我从这个示例中复制了“def onerasebackup(self,evt)”并将其绑定到evt_ERASE_BACKGROUND。结果:面板用灰色重新绘制背景图像。我的背景图像具有相同的宽度,但高于面板。在这里,您可以看到面板重新绘制了图像:(绿色底部是我的图像的一部分;灰色矩形是我的面板)。 我还将这些行添加到我的_uinit__;中: import wx class MyForm(wx.Frame):
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的大小)->就可以看到,该面板重新绘制了图像。问题是家长的问题。如果你看我的其他部分,你会注意到我将EVT_ERASE_背景绑定到面板,而不是框架。此外,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方法来设置最大和最小大小限制。否则,当您调整帧的大小大于图像时,您将看到边框上的灰色。我认为您需要提供一个完整的可运行的小示例。您是否将面板的背景样式设置为wx.BG_style_CUSTOM?您是否将EVT_ERASE_背景绑定到面板?非常感谢,现在我的图像显示在我的“startpanel”上。但是还有两个问题:1)图像只显示在我的startpanel上,但我还有一些面板,它们应该接收相同的背景图像。我是否必须将EVT_擦除_背景绑定到每个面板上,或者是否有其他方法解决此问题?2)如您所见,面板上有一个静态文本。这个文本周围有一个灰色的矩形。。。是否可以删除这个灰色矩形/使其透明?我认为您必须对所有面板应用相同的技术,因为每个面板都有自己的实例。您可以使用背景图像创建一个基础面板,然后为所有面板创建子类。至于文本,我不确定,但我怀疑。如果你希望文本没有背景,你可能需要自己画。好的,谢谢!顺便说一句:我刚刚发现我还必须更改这行代码:self.startpanel.SetSizer(hSizer)没问题。对不起,我错过了那一点。