wxpython - 擦除背景会擦除非背景组件

时间:2015-03-06 15:10:21

标签: python wxpython

在wxpython中,我希望有一个窗口,其中的图片会根据工具栏按钮的使用而改变,图片顶部会显示文本控件。当我单击工具栏按钮时,我发布了一个擦除背景事件,然后捕获擦除事件,并从那里重新绘制新背景(基于this)。

除了在重绘背景后停止绘制文本控件之外,大部分效果都很好。他们还在那里,只是没画画。

这是一个演示此问题的简化代码。如果您运行此代码并单击按钮以切换绘制背景图像,文本控件将消失。

import wx
import wx.lib.inspection

class PanelWithDrawing(wx.Panel):
    def __init__(self, parent):
        super(PanelWithDrawing, self).__init__(parent, size=(100, 40))

        self.showbmp = False

        self.txt = wx.TextCtrl(self, pos=(10, 10))

    def onErase(self, dc):
        if self.showbmp:
            # dc.DrawBitmap(wx.Bitmap('background.png', 0, 0)
            dc.DrawRectangle(0, 0, 40, 40)   # use a drawing instead so you don't have to find a png

class Toolbar(wx.ToolBar):
    def __init__(self, parent):
        super(Toolbar, self).__init__(parent, -1)

        self.AddLabelTool(wx.ID_SAVE, "Record", wx.Bitmap("picture.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "", "")

class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title)

        self.toolbar = Toolbar(self)
        self.SetToolBar(self.toolbar)
        self.toolbar.Realize()

        self.panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        self.panel1 = PanelWithDrawing(self.panel)
        vbox.Add(self.panel1)

        # self.panel2 = PanelWithText(self.panel)
        # vbox.Add(self.panel2)

        self.panel.SetSizer(vbox)

        self.Centre()
        self.Show()

        self.toolbar.Bind(wx.EVT_TOOL, self.onButton)
        self.panel1.Bind(wx.EVT_ERASE_BACKGROUND, self.onErase)

    def onErase(self, evt):
        try:
            dc = evt.GetDC()
        except:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        self.panel1.onErase(dc)

    def onButton(self, evt):
        self.panel1.showbmp = not self.panel1.showbmp
        wx.PostEvent(self.panel1, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND))


if __name__ == '__main__':

    app = wx.App()
    Example(None, title='Example')
    wx.lib.inspection.InspectionTool().Show()   # use this for debugging GUI design
    app.MainLoop()

如何告诉wxpython再次绘制所有非背景内容?或者,我怎么不首先取消它?

1 个答案:

答案 0 :(得分:1)

在工作了几天之后,我明白了!答案很简单(像往常一样)。

wx.PostEvent(self.panel1, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND))应替换为self.Refresh()以刷新整个框架,而不仅仅强制执行特定(并且显然不安全)的重绘。