wx.AutoBufferedPaintDC

Plattformunabhängige GUIs mit wxWidgets.
Antworten
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

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
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

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
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

das Problem ist AutoBufferedPaintDCFactory() <-> BufferedDC()

con
Antworten