2014-09-15 2 views
1

Я пытаюсь создать 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 
+0

Ваш пример работает как ожидается на wxPython 2.9.5/Python 2.7.6 32 бит на Win7 32 бит (обработка EVT_PAINT при щелчке). Вы на другой платформе? – nepix32

+0

Да, я на Mac OS с wxpython 3. Я редактировал свой вопрос. – adrianN

+0

Протестировано также на wxPython 3.0.0.0 msw (классический), здесь нет проблем. Было бы интересно, что разница betreen «родной» и не «родной красной событие» должна быть ... – nepix32

ответ

1

Refresh Вызова методы окна будет инициировать событие рисования, пометив окно или subrectangle его как «повреждение». Затем система отправит событие рисования, как только это возможно, со всеми «поврежденными» регионами, добавленными вместе в область обновления события. Если вы хотите, чтобы событие рисования произошло немедленно, а не ожидало систему, вы можете вызывать метод окна, однако, как правило, правильная вещь - просто ждать, пока система отправит ее естественным образом.

+0

Так что я не должен отправлять PaintEvents вообще? В документации об этом ничего не говорится. – adrianN

+0

Интересно заменить все на 'self.onclick' на' self.Update() '(вместо' self.Refresh() ', как было предложено, никакие события Paint не генерируются щелчком. – nepix32

+0

**> Поэтому я не должен отправьте PaintEvents вообще? ** Да и нет. Вы всегда должны позволять системе отправлять события рисования, потому что для ее работы требуется определенное обслуживание конкретной платформы. OTOH, 'Refresh' - это механизм, который вы можете использовать для попросите систему отправить событие. – RobinDunn

Смежные вопросы