Как отправить PaintEvent в wxpython

Я пытаюсь сгенерировать PaintEvent в wxpython, чтобы вызвать перерисовку окна. Однако я не могу заставить его работать, я получаю ошибки, потому что я пытаюсь использовать 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()

Я знаю, что мог бы вызвать 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

1 ответ

Вызывая окно Refresh Метод вызовет событие рисования, пометив окно или его прямоугольник как "поврежденный". Затем система отправит событие рисования, как только сможет, со всеми "поврежденными" областями, добавленными вместе в область обновления события. Если вы хотите, чтобы событие рисования происходило немедленно, вместо ожидания системы, вы можете вызвать окно Update метод, однако, как правило, правильнее всего подождать, пока система естественным образом отправит его.

Другие вопросы по тегам