ОК, это не совсем тривиально, я думаю ... Но я нашел поток " wxPython - рисование без события рисования - Python отвечает ", где упоминается:
Одна из хороших стратегий из примера в "wxPython in Action" заключается в следующем:
- фрейм имеет методы Draw, которые рисуют в BufferedDC, который связан с элементом растрового изображения,
- внутри метода рисования, элемент растрового изображения рисуется на экране
... однако, это на самом деле немного вводит в заблуждение - если мы посмотрим на один из этих примеров, такой как Chapter-06 / example1.py , заметно, что приложение порождает wx.Frame
(как в моем примере);но wx.Frame
здесь просто инициализируется созданием экземпляра wx.Window
- и здесь , где происходит вся эта вещь DC onPaint
.
Имея это в виду, мой код выше может быть изменен, так что он, наконец, снова работает (то есть отображается синий круг), как показано ниже:
#!/usr/bin/env python
# http://www.linuxquestions.org/questions/programming-9/wxwidgets-wxpython-drawing-problems-with-onpaint-event-703946/
import wx
class MainWindowWindow(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.circles = list()
self.displaceX = 30
self.displaceY = 30
circlePos = (self.displaceX, self.displaceY)
self.circles.append(circlePos)
## uncommenting either only first, or both of
## the commands below, now calls onPaint
## (without these panels, OnPaint called once - with them, twice)
self.panel = wx.Panel(self, wx.ID_ANY)
self.mpanelA = wx.Panel(self.panel, -1, size=(200,50))
def OnPaint(self, e):
print "OnPaint called"
dc = wx.PaintDC(self)
dc.SetPen(wx.Pen(wx.BLUE))
dc.SetBrush(wx.Brush(wx.BLUE))
# Go through the list of circles to draw all of them
for circle in self.circles:
dc.DrawCircle(circle[0], circle[1], 10)
class MainWindow(wx.Frame):
def __init__(self, parent, title, size=wx.DefaultSize):
wx.Frame.__init__(self, parent, wx.ID_ANY, title, wx.DefaultPosition, size)
MainWindowWindow(self)
def main():
app = wx.App()
win = MainWindow(None, "Draw delayed circles", size=(620,460))
win.Show()
app.MainLoop()
if __name__ == "__main__":
main()
Что ж, надеюсь, это кому-то поможет,
Ура!