wxpython - 擦除背景擦除非背景组件
Posted
技术标签:
【中文标题】wxpython - 擦除背景擦除非背景组件【英文标题】:wxpython - Erase background erases non-background components 【发布时间】:2015-05-08 05:29:41 【问题描述】:在 wxpython 中,我希望有一个带有图片的窗口,该窗口根据使用工具栏按钮和图片顶部的文本控件而改变。当我单击工具栏按钮时,我将发布一个擦除背景事件,然后捕获擦除事件,并从那里重新绘制新背景(基于this)。
除了我重绘背景后文本控件停止绘制之外,大部分情况下都很好用。它们还在那里,只是没有画出来。
这是一个演示问题的简化代码。如果您运行此代码并单击按钮来切换是否绘制背景图像,则文本控件会消失。:
导入 wx 导入 wx.lib.inspection 类 PanelWithDrawing(wx.Panel): def __init__(自我,父母): super(PanelWithDrawing, self).__init__(parent, size=(100, 40)) self.showbmp = 假 self.txt = wx.TextCtrl(self, pos=(10, 10)) def onErase(自我,直流): 如果 self.showbmp: # dc.DrawBitmap(wx.Bitmap('background.png', 0, 0) dc.DrawRectangle(0, 0, 40, 40) # 使用绘图代替,因此您不必查找 png 类工具栏(wx.ToolBar): def __init__(自我,父母): 超级(工具栏,自我).__init__(父,-1) self.AddLabelTool(wx.ID_SAVE, "记录", wx.Bitmap("picture.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "", "") 类示例(wx.Frame): def __init__(self, parent, title): 超级(示例,自我).__init__(父,标题=标题) self.toolbar = 工具栏(自我) 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.toolbar.Bind(wx.EVT_TOOL, self.onButton) self.panel1.Bind(wx.EVT_ERASE_BACKGROUND, self.onErase) def onErase(self, evt): 尝试: dc = evt.GetDC() 除了: dc = wx.ClientDC(self) rect = self.GetUpdateRegion().GetBox() dc.SetClippingRect(rect) dc.清除() self.panel1.onErase(dc) def onButton(self, evt): self.panel1.showbmp = 不是 self.panel1.showbmp wx.PostEvent(self.panel1, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND)) 如果 __name__ == '__main__': 应用程序 = wx.App() 示例(无,标题='示例') wx.lib.inspection.InspectionTool().Show() # 用于调试 GUI 设计 app.MainLoop()我如何告诉 wxpython 重新绘制所有非背景的东西?或者,我如何不首先取消绘制它?
【问题讨论】:
【参考方案1】:经过几天的努力,我明白了!答案很简单(和往常一样)。
wx.PostEvent(self.panel1, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND))
应替换为 self.Refresh()
以刷新整个帧,而不仅仅是强制特定(并且显然不安全)重绘。
【讨论】:
以上是关于wxpython - 擦除背景擦除非背景组件的主要内容,如果未能解决你的问题,请参考以下文章
wxWidgets第六课 EVT_ERASE_BACKGROUND背景擦除事件