Я пытаюсь создать PaintEvent в wxpython, чтобы вызвать перерисовку окна. Тем не менее, я не могу заставить его работать, я получаю ошибки, потому что я пытаюсь использовать PaintDC вне собственного события рисования.Как отправить PaintEvent в wxpython
Вот минимальный пример:
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()
Я знаю, что я мог бы назвать Refresh() в обработчике OnClick, чтобы получить ту же функциональность (и использовать 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
Ваш пример работает как ожидается на wxPython 2.9.5/Python 2.7.6 32 бит на Win7 32 бит (обработка EVT_PAINT при щелчке). Вы на другой платформе? – nepix32
Да, я на Mac OS с wxpython 3. Я редактировал свой вопрос. – adrianN
Протестировано также на wxPython 3.0.0.0 msw (классический), здесь нет проблем. Было бы интересно, что разница betreen «родной» и не «родной красной событие» должна быть ... – nepix32