Принудительно перерисовывать в wxPython Canvas - PullRequest
4 голосов
/ 20 мая 2011

У меня есть Canvas, который манипулирует объектами в обработчике событий мыши. После изменения объектов я хочу вызвать событие OnPaint () для того же Canvas, чтобы показать (повторно отобразить) изменения. Как правильно это сделать? Это не позволяет мне вызывать OnPaint () напрямую. Кроме того, является ли запуск какого-либо события из другого события «в некотором смысле неправильным» или может привести к проблемам?

Ответы [ 2 ]

4 голосов
/ 20 мая 2011

Я бы просто вызвал self.Refresh () или, может быть, RefreshRect () и пропустил область, которую нужно перекрасить.

1 голос
/ 23 мая 2011

Я попробовал self.refresh (), как предложено Майком Дрисколлом. Это сработало частично. Я перемещаю свои собственные объекты с помощью событий мыши, а затем перекрашиваю изображение - рендеринг моих объектов. Таким образом, события мыши обновляли координаты, а перерисовка обновляла отображение. Проблема в том, что refresh (), кажется, вызывается лениво или имеет более низкий приоритет, чем события мыши. Таким образом, функция Refresh () приводит к прерывистому отображению.

Поскольку я использую буферизованное отображение через wxDemo для прокручиваемой области, я взял следующую строку из события Paint:

dc = wx.BufferedPaintDC(self, self.buffer, wx.BUFFER_VIRTUAL_AREA)

И вызвал мою функцию рисования с этим DC из обработчика событий мыши. По окончании dc освобождается и (согласно комментариям в демоверсии) копируется на экран. Раньше мне не было ясно, как событие Paint обрабатывает контроллеры домена, поэтому я пытался вызвать событие. Оказывается, вы можете использовать этот DC и просто визуализировать события мыши. Это приводит к плавному перетаскиванию моих пользовательских нарисованных объектов.

...