首页 文章

wxpython发布删除背景与DC

提问于
浏览
0

我在发布擦除背景事件以绘制到屏幕时遇到问题 . 在我的完整代码中,我想在单击按钮时绘制位图(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()

这引起了:

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

我怎么解决这个问题?

1 回答

  • 0

    在发布之前已经工作了一个小时没有成功,然后在五分钟后自己解决了......

    这是我的解决方案,如果事件没有自己的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()
    

相关问题