GraphicsPath не всегда обновляет себя - PullRequest
1 голос
/ 27 февраля 2010

Простая кривая в этом приложении появляется только тогда, когда она перетаскивается за пределы экрана или размер окна изменяется. Когда приложение только запускается, оно не появляется, а когда окно развернуто или свернуто, оно также исчезает. Тем не менее, все это время печатается «Path Drawn», поэтому вызываются все функции рисования. Есть ли что-то, что я делаю не так в отношении создания и рисования графического контекста? Если нет, как я могу полностью обновить окно в этих особых случаях?

import wx

class Path(object):
    def paint(self,gc):
        print "Path Drawn"
        gc.SetPen(wx.Pen("#000000",1))
        path=gc.CreatePath()
        path.MoveToPoint(wx.Point2D(10,10))
        path.AddCurveToPoint(wx.Point2D(10,50),
                             wx.Point2D(10,150),
                             wx.Point2D(100,100))
        gc.DrawPath(path)


class TestPane(wx.Panel):
    def __init__(self,parent=None,id=-1):
        wx.Panel.__init__(self,parent,id,style=wx.TAB_TRAVERSAL)
        self.SetBackgroundColour("#FFFFFF")
        self.Bind(wx.EVT_PAINT,self.onPaint)
        self.SetDoubleBuffered(True)
        self.path=Path()

    def onPaint(self, event):
        event.Skip()

        dc=wx.PaintDC(self)
        dc.BeginDrawing()
        gc = wx.GraphicsContext.Create(dc)

        gc.PushState()
        self.path.paint(gc)
        gc.PopState()
        dc.EndDrawing()

    def drawTestRects(self,dc):
        dc.SetBrush(wx.Brush("#000000",style=wx.SOLID))
        dc.DrawRectangle(50,50,50,50)
        dc.DrawRectangle(100,100,100,100)

class TestFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(640,480))
        self.mainPanel=TestPane(self,-1)

        self.Show(True)


app = wx.App(False)
frame = TestFrame(None,"Test App")
app.MainLoop()

1 Ответ

2 голосов
/ 28 февраля 2010

Закомментируйте часть self.SetDoubleBuffered(True), и она будет работать, потому что из-за ошибки http://trac.wxwidgets.org/ticket/11138 окно не обновляется правильно, если SetDoubleBuffered и GraphicsContext используются вместе.

Если вам ОБЯЗАТЕЛЬНО нужна двойная буферизация, то внедрите ее сами, например. сначала нарисуйте на MeomryDC, а затем перетащите или раскрасьте растровое изображение, чтобы нарисовать DC.

...