在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再次绘制所有非背景内容?或者,我怎么不首先取消它?
答案 0 :(得分:1)
在工作了几天之后,我明白了!答案很简单(像往常一样)。
wx.PostEvent(self.panel1, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND))
应替换为self.Refresh()
以刷新整个框架,而不仅仅强制执行特定(并且显然不安全)的重绘。