如何在wxpython中发送PaintEvent

时间:2014-09-15 12:34:07

标签: wxpython

我正在尝试在wxpython中生成一个PaintEvent来触发重绘窗口。但是,我似乎无法使它工作,我得到错误,因为我尝试在本机绘制事件之外使用PaintDC。

这是一个最小的例子:

import wx

class AppFrame(wx.Frame):
    def __init__(self):
        super(AppFrame, self).__init__(parent=None, title="Demo")
        self.SetClientSize((800,600))

        self.Bind(wx.EVT_PAINT, self.paint)

        self.Bind(wx.EVT_LEFT_DOWN, self.onclick)

    def onclick(self, event):
        wx.PostEvent(self,wx.PaintEvent())

    def paint(self, event=None):
        print "paint"
        dc = wx.PaintDC(self)
        dc.SetPen(wx.Pen(wx.BLACK, 4))
        dc.DrawLine(0, 0, 50, 50)

if __name__ == "__main__":
    app = wx.App(redirect=False)
    appFrame = AppFrame()
    appFrame.Show()
    app.MainLoop()

我知道我可以在onclick处理程序中调用Refresh()来获得相同的功能(并使用CallAfter使其成为线程安全的),但我想理解为什么我不能发送PaintEvents。

我在Mac OS 10.7上使用wxpython 3.0.1.1,Python 2.7.1。我得到的错误是

  File "test.py", line 17, in paint
    dc = wx.PaintDC(self)
  File "/usr/local/lib/wxPython-3.0.0.0/lib/python2.7/site-packages/wx-3.0-osx_cocoa/wx/_gdi.py", line 5122, in __init__
    _gdi_.PaintDC_swiginit(self,_gdi_.new_PaintDC(*args, **kwargs))
wx._core.PyAssertionError: C++ assertion "window->MacGetCGContextRef() != NULL" failed at /BUILD/wxPython-src-3.0.0.0/src/osx/carbon/dcclient.cpp(195) in wxPaintDCImpl(): using wxPaintDC without being in a native paint event

1 个答案:

答案 0 :(得分:2)

调用窗口的Refresh方法将触发绘制事件,方法是将窗口或其子矩形标记为“已损坏”。然后,系统将尽快发送绘制事件,并在事件的更新区域中将所有“损坏”区域添加到一起。如果你想让paint事件立即发生而不是等待系统,你可以调用窗口的Update方法,但通常正确的做法就是等待系统自然发送它。