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

wxpython使用DC后擦除背景

公羊浩气
2023-03-14

我在发布要绘制到屏幕的擦除背景事件时遇到麻烦。在我的完整代码中,我想在单击按钮时绘制一个位图(dc.drawBitmap())。我通过发布一个由自定义绑定方法捕获的EVT_ERASE_BACKGROUND事件来实现这一点。但是,一旦它在那个方法中,正常工作的event.getDc()方法就会失败。

下面是一个简化的代码,也有相同的结果:

import wx

class Foo(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__ (self, parent, -1, title, size=(500,300))
        self.panel = wx.Panel(self, -1)

        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
        self.Bind(wx.EVT_ENTER_WINDOW, self.onEnter)

        self.Show()

    def OnEraseBackground(self, e):
        DC = e.GetDC()

    def onEnter(self, e):
        wx.PostEvent(self, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND))

app = wx.App()
Foo(None, 'foo')
app.MainLoop()

null

AttributeError: 'PyCommandEvent' object has no attribute 'GetDC'

我该怎么解决这个?

共有1个答案

沈宇定
2023-03-14

在发帖前我花了一个小时都没成功,然后我自己在五分钟后解决了这个问题。

下面是我的解决方案,如果事件没有自己的DC,则创建一个ClientDC:

import wx

class Foo(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__ (self, parent, -1, title, size=(500,300))
        self.panel = wx.Panel(self, -1)

        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
        self.Bind(wx.EVT_ENTER_WINDOW, self.onEnter)

        self.Show()

    def OnEraseBackground(self, e):
        try:
            DC = e.GetDC()
        except:
            DC = wx.ClientDC(self)
        DC.Clear()

    def onEnter(self, e):
        wx.PostEvent(self, wx.PyCommandEvent(wx.wxEVT_ERASE_BACKGROUND))

app = wx.App()
Foo(None, 'foo')
app.MainLoop()
 类似资料:
  • 在wxpython中,我希望有一个带有图片的窗口,该窗口会根据工具栏按钮的使用而改变图片的顶部的文本控件。当我单击工具栏按钮时,我将发布一个擦除背景事件,然后捕获擦除事件,并从那里重绘新的背景(基于此)。 大部分工作良好,除了文本控件停止绘制一旦我重画背景。它们还在那里,只是没有画出来。 下面是一个演示该问题的简化代码。如果运行此代码并单击按钮以切换是否绘制背景图像,则文本控件将消失。提示: 我如

  • 这是我的密码。现在钢笔绘图工作,橡皮擦绘图擦除,但它擦除背景图像。我只想让它擦去钢笔。 如果你能给我提示该怎么做,我将不胜感激。 === ====

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

  • 我正在尝试完全加载此页面:https://candidat.pole-emploi.fr/offres/emploi/horticulteur/s1m1 我设置了一行代码来处理cookie弹出。 然后,我设置了一些行来单击加载更多结果按钮,以便加载完整的html,然后将其打印出来。 但单击一次后,我发现一条错误消息: 我不知道这意味着什么,也不知道如何修复它

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

  • 本文向大家介绍Bash 使用DC的数学,包括了Bash 使用DC的数学的使用技巧和注意事项,需要的朋友参考一下 示例 dc 是Unix上最古老的语言之一。 它使用的是反向抛光符号,这意味着您首先要堆叠数字,然后是运算。例如1+1写为1 1+。 要从堆栈顶部打印元素,请使用命令 p 您可以多次打印顶部元素 对于负数,请使用_前缀 您也可以使用大写字母fromA to F作为介于10 and 15和之