【问题标题】:Panel repaints background image (using EVT_ERASE_BACKGROUND)面板重绘背景图像(使用 EVT_ERASE_BACKGROUND)
【发布时间】:2012-09-22 01:37:48
【问题描述】:

我有一个带有几个不同面板的框架,每个面板都应获得相同的背景图像。所以我找到了这个例子: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 的大小)-> 只是为了看看,面板会重新绘制图像。

【问题讨论】:

  • 我认为您需要提供一个完整的小型可运行示例。您是否将面板的背景样式设置为 wx.BG_STYLE_CUSTOM?您是否将 EVT_ERASE_BACKGROUND 绑定到面板?

标签: wxpython


【解决方案1】:

问题是育儿问题。如果您查看我的 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 方法来设置最大和最小调整大小限制。否则,当您将框架调整为大于图像的大小时,您会在边框上看到灰色。

【讨论】:

  • 非常感谢,现在我的图像显示在我的“启动面板”上。但仍然存在 2 个问题: 1)图像仅显示在我的启动面板上,但我还有一些面板应该接收相同的背景图像。我是否必须将 EVT_ERASE_BACKGROUND 绑定到这些面板中的每一个,还是有其他方法可以解决这个问题? 2nd) 如您所见,面板上有一个 StaticText。而且这个StaticText周围有一个灰色的矩形......是否可以删除这个灰色的矩形/使其透明?
  • 我认为你必须对所有面板应用相同的技术,因为每个面板都是它自己的实例。您可以使用背景图像创建一个基本面板,然后为所有面板创建子类。至于StaticText,我不确定,但我对此表示怀疑。如果您希望文本没有背景,您可能需要自己绘制。
  • 好的,谢谢!顺便说一句:我刚刚发现我还必须更改这一行:self.startpanel.SetSizer(hSizer)
  • 没问题。抱歉,我错过了那一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2013-04-10
  • 2017-08-19
相关资源
最近更新 更多