我正在尝试在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
答案 0 :(得分:2)
调用窗口的Refresh
方法将触发绘制事件,方法是将窗口或其子矩形标记为“已损坏”。然后,系统将尽快发送绘制事件,并在事件的更新区域中将所有“损坏”区域添加到一起。如果你想让paint事件立即发生而不是等待系统,你可以调用窗口的Update
方法,但通常正确的做法就是等待系统自然发送它。