Seite 1 von 1

wx.AutoBufferedPaintDC

Verfasst: Mittwoch 13. August 2008, 21:36
von conloos
Hallo ich bin immer noch dabei mein Programm umzuschreiben und habe da ein Problem wo ich nicht weiss ob es ein denkfehler ist oder ein wx bug?!

originalcode:

Code: Alles auswählen

def OnPaint(self, evt=None, shape=None):
        logging.debug(u"OnPaint")
        logging.debug(u"\t Folgendes Event wurde übergeben: " + str(evt))
        logging.debug(u"\t Folgendes Shape wurden übergeben: " + str(shape))
        
        #Uebergabe des DC an das Panel       
        #dc = wx.PaintDC(self)
         
        p_dc = wx.PaintDC(self)
                    
        if sys.platform == "darwin":
            logging.debug("\t Folgende Plattform wurde erkannt:" + sys.platform)
            dc = p_dc #default dc
            logging.debug("\t es wurde die gc Drawengine verwendet.")
        else :
            logging.debug("\t Folgende Plattform wurde erkannt:" + sys.platform)
            dc = wx.GCDC(p_dc) #wx.GCDC(dc)
            logging.debug("\t Es wurde die gcdc Drawengine verwendet.")


        if not evt:
            self.TileBackground(dc)
        self.PrepareDC(dc)
        self.DrawShapes(dc)

        if shape:
            # adjusting redraw rect to delete text under image
            size =dc.GetSizeTuple()
            self.RefreshRect(wx.Rect(1, 1, size[0], size[1]), True)
            self.Update()

neu:

Code: Alles auswählen

    def OnPaint(self, evt=None, shape=None):
        """ Draws buffer to the screen.
            Desides whether OS is auto buffered or not.
            On Mac gcdc had a lot of problems, so we dont use them on mac."""
        
        logging.debug(u"BufferedWindow - OnPaint")

        paintdc = wx.AutoBufferedPaintDCFactory(self)
        
        if sys.platform == "darwin":
            logging.debug("\t Folgende Plattform wurde erkannt:" + sys.platform)
            dc = paintdc #default dc
            logging.debug("\t es wurde die gc Drawengine verwendet.")
        else :
            logging.debug("\t Folgende Plattform wurde erkannt:" + sys.platform)
            dc = wx.GCDC(paintdc) #wx.GCDC(dc)
            logging.debug("\t Es wurde die gcdc Drawengine verwendet.")
        
        if not evt:
            self.TileBackground(dc)    
        self.PrepareDC(dc)
        self.DrawShapes(dc)

        if shape:
            # adjusting redraw rect to delete text under image
            size =dc.GetSizeTuple()
            self.RefreshRect(wx.Rect(1, 1, size[0], size[1]), True)
            self.Update()

        dc.DrawBitmap(self._Buffer,0,0)
Wie ich Grade gemerkt habe betrifft dieses Problem nur Windows!
Bei der Initialisierung wird die Funktion aufgerufen und das ohne Problem, jedoch wenn die Funktion über ein event gestartet wird, wird Folgendendes ausgegeben:

Code: Alles auswählen

File "C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\_gdi.py", line 4937,
 in AutoBufferedPaintDCFactory
    return _gdi_.AutoBufferedPaintDCFactory(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "wxAssertFailure" failed at ..\..\src\m
sw\dcclient.cpp(219) in wxPaintDC::wxPaintDC(): wxPaintDC may be created only in
 EVT_PAINT handler!
08-13 22:25 root         DEBUG    OnLeftUp
Dabei sollte doch AutoBufferedPaintDCFactory nur entweder ein PaintDC oder ein BufferedPaintDC zurückgeben. Hat jemand eine Idee wie ich das umschiffen kann?


con

Verfasst: Freitag 15. August 2008, 14:08
von conloos
Also nach einigem Lesen habe ich herausgefunden, das es an der Art liegt wie ich das event aufrufe. Das heißt die Funktion funktioniert unter allen U*ix Plattformen, jedoch nicht unter Windows, weil Windows da strikter ist.
Ein event darf nur mit zB. self.Paint und nicht self.Paint(evt, xxx) aufgerufen werden.

con

Blödsinn

Verfasst: Mittwoch 17. September 2008, 12:31
von conloos
das Problem ist AutoBufferedPaintDCFactory() <-> BufferedDC()

con