当前位置: 首页 > 知识库问答 >
问题:

wxpython-Erase background擦除非后台组件

奚瑾瑜
2023-03-14

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

大部分工作良好,除了文本控件停止绘制一旦我重画背景。它们还在那里,只是没有画出来。

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

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个答案

祁烈
2023-03-14

经过几天的努力,我得到了!答案很简单(和往常一样)。

null

 类似资料:
  • 我在发布要绘制到屏幕的擦除背景事件时遇到麻烦。在我的完整代码中,我想在单击按钮时绘制一个位图(dc.drawBitmap())。我通过发布一个由自定义绑定方法捕获的EVT_ERASE_BACKGROUND事件来实现这一点。但是,一旦它在那个方法中,正常工作的event.getDc()方法就会失败。 下面是一个简化的代码,也有相同的结果: null 我该怎么解决这个?

  • OracleDoc说泛型是在java中使用调用类型擦除的技术实现的,这就是它的工作原理。 如果类型参数是无界的,则用其边界或对象替换泛型类型中的所有类型参数。因此,生成的字节码只包含普通类、接口和方法 所以,如果我有一个通用类说容器如下: 通过类型擦除处理后,它的等效类将如下所示: 如果这里有错误,请纠正我 类似地,如果a修改上述类,如下所示 这不会相当于??? 如果这是真的,那么我也应该有这样的

  • 我有一个这样定义的方法: 我的单元测试我错误地这样测试它: 这应该会产生编译时错误(当我尝试使用javac编译它时,它会产生编译时错误),但eclipse允许它编译。 我真的不明白为什么eclipse允许这段代码编译,有人能提供一些信息吗,为什么这会在eclipse中编译? eclipse版本是:面向Web开发人员的eclipse Java EE IDE。版本:Luna Service Relea

  • 当显示主片段时,我试图清除后堆栈中的所有片段。在导航图中,我添加了这个动作 在登录片段中。我尝试了findNavController()。导航(LoginFragmentDirections.actionLoginFragmentToHomeFragment()) 和 我从这里的文件中了解到https://developer.android.com/guide/navigation/navigat

  • 问题内容: 我以为Java擦除会在编译时消除泛型类型,但是当我自己对其进行测试时,我意识到在Bytecode中有一些有关泛型类型的信息。 这是我的测试: 我写了2节课: 和 我编译了两个类,并在通用类的某个地方看到了这一行 在非泛型类中: 所以很明显我在字节码中有通用信息,那么这个擦除的东西是什么? 问题答案: 一些通用类型信息存储在属性中。请参阅JLS 4.8 和4.6以及JVM规范4.3.4。

  • 在Canvas上绘制确实是很有趣的事情,但当你画错了或者想要清除画布和绘制其他图形时,应该如何做呢? 有两个方法可以使用:1.clearRect方法和2.重新设置画布宽高。我们首先学习2D渲染上下文的clearRect方法。 clearRect方法 假设你在Canvas上只画了一个正方形和圆形: context.fillRect(40, 40, 100, 100); context.be