wx.AutoBufferedPaintDC

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

wx.AutoBufferedPaintDC

Beitragvon conloos » Mittwoch 13. August 2008, 21:36

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: 21
Registriert: Freitag 23. November 2007, 09:54

Beitragvon conloos » Freitag 15. August 2008, 14:08

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: 21
Registriert: Freitag 23. November 2007, 09:54

Blödsinn

Beitragvon conloos » Mittwoch 17. September 2008, 12:31

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

con

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder