wxPython Hintergrund Bild auf Rahmen

MMGP Answerd aber wird nicht lassen Sie mich credit Sie ihm Recht 😉 So will ich wenigstens erwähnen ihn hier.
(Und ich habe endlich das bekommen, Kredit ihm... 😎

Seine verlinkte Diskussion auf die Doppelte Pufferung eine Basis-code, arbeitete mit folgenden änderungen:

Fügen Sie diesen Anfang in Zeile 106 (overwritting vorhandenen Codes, bis Sie auf die Letzte Zeile hier dargestellt):

    # Here's the actual drawing code.
    cliWidth, cliHeight = self.GetClientSize()
    bmp=wx.Bitmap("Logo16x9.png")
    bmpWide = bmp.GetWidth()
    bmpHeight = bmp.GetHeight()
    img = bmp.ConvertToImage()
    scaleFactor = cliWidth/bmpWide
    bmp = wx.BitmapFromImage(img.Scale(int(bmpWide * scaleFactor), int(bmpHeight * scaleFactor)))
    bmpWide = bmp.GetWidth()
    bmpHeight = bmp.GetHeight()
    xPos = (cliWidth - (bmpWide))/2
    yPos = (cliHeight - (bmpHeight))/2
    # altered by me
    dc.DrawBitmap(bmp, xPos, yPos)


class TestFrame(wx.Frame):

Ich habe gegen mein Kopf gegen diese den ganzen Tag.

Ich bin neu in der Zeichnung-Grafik mit wxPython Module, und wenn ich brauchte, um einen hintergrund zu zeichnen, die auf einem Rahmen fand ich dieser code, die gut funktioniert, wenn das Bild die volle Größe des Fensters.

Jedoch, ich muss ein Firmenlogo als hintergrund, und haben es zentriert zu bleiben, durch die Größe. In seiner aktuellen form ist die Größe bewirkt, dass ein grafisches Artefakt, das die Größe einer kleinen nation, die auf dem Bildschirm erscheinen, mit jedem resize-Ereignis.

Logo-Bild-Datei (auf der Linie 43 code) ist ein 400x300 (BxH) Bild.

Ich bin auf der Suche nach einem Weg, um entweder: ändern Sie die Größe meines Bildes "on the fly" match wx.GetClientSize(),
oder ein Weg, um zu vermeiden/entfernen Sie das Artefakt. Vorzugsweise ohne Einbeziehung von PIL oder ImageMagick. App hat zu funktionieren, auf lokaler Ebene nur, und sein system nicht (Win, Lin und Mac), keine dieser beinhaltet die Netzwerk-Aktivitäten oder zugeordnete Laufwerke.

Python 2.7 und wxPython 2.8

Den code, den ich verwende (mit meinen änderungen mit Anmerkungen versehen) ist wie folgt:

import wx

########################################################################
class MainPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)
        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
        self.frame = parent

        sizer = wx.BoxSizer(wx.VERTICAL)
        hSizer = wx.BoxSizer(wx.HORIZONTAL)

        for num in range(4):
            label = "Button %s" % num
            btn = wx.Button(self, label=label)
            sizer.Add(btn, 0, wx.ALL, 5)
        hSizer.Add((1,1), 1, wx.EXPAND)
        hSizer.Add(sizer, 0, wx.TOP, 100)
        hSizer.Add((1,1), 0, wx.ALL, 75)
        self.SetSizer(hSizer)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)

    #----------------------------------------------------------------------
    def OnEraseBackground(self, evt):
        """
        Add a picture to the background
        """
        # yanked from ColourDB.py
        dc = evt.GetDC()
        # Added by me
        cliWidth, cliHeight = self.GetClientSize()

        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        # use a 400x300 image
        bmp = wx.Bitmap("Logo4x3.png")
        # added by me
        xPos = (cliWidth - 400)/2
        yPos = (cliHeight - 300)/2
        # altered by me
        dc.DrawBitmap(bmp, xPos, yPos)
        #dc.DrawBitmap(bmp, 0, 0)

########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, size=(600,450))
        panel = MainPanel(self)        
        self.Center()

########################################################################
class Main(wx.App):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, redirect=False, filename=None):
        """Constructor"""
        wx.App.__init__(self, redirect, filename)
        dlg = MainFrame()
        dlg.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = Main()
    app.MainLoop()

Update: Aktuelle Ausfall - Modifizierte Zeilen 37 bis 52

if not dc:
    dc = wx.ClientDC(self)
    rect = self.GetUpdateRegion().GetBox()
    dc.SetClippingRect(rect)
dc.Clear()
# use a 400x300 image
bmp = wx.Bitmap("Logo4x3.png")
img = bmp.ConvertToImage()
scaleFactor = cliWidth/400
bmp = wx.BitmapFromImage(img.Scale(int(400*scaleFactor),int(300*scaleFactor)))
# added by me
#xPos = (cliWidth - 400)/2
#yPos = (cliHeight - 300)/2
# altered by me
#dc.DrawBitmap(bmp, xPos, yPos)
dc.DrawBitmap(bmp, 0, 0)

Einen weiteren Versuch, und einem weiteren scheitern. Keinen Unterschied in der Ausgabe auf den Bildschirm. Zusätzlich das referenzierte Dokument auf doppelte Pufferung nicht dieses Problem zu beheben, aber nicht leiden, aus dem selben Ergebnis. Dieser code ändert Zeilen 36 bis 57 des Originals.

brsh = wx.Brush('#000000')


if not dc:
    dc = wx.ClientDC(self)
    rect = self.GetUpdateRegion().GetBox()
    dc.SetClippingRect(rect)
dc.SetBackground(brsh)
dc.SetDeviceOrigin(0,0)
dc.DestroyClippingRegion()
dc.Clear()
# use a 400x300 image
bmp = wx.Bitmap("Logo4x3.png")
img = bmp.ConvertToImage()
scaleFactor = cliWidth/400
bmp = wx.BitmapFromImage(img.Scale(int(400*scaleFactor),int(300*scaleFactor)))
# added by me
#xPos = (cliWidth - 400)/2
#yPos = (cliHeight - 300)/2
# altered by me
#dc.DrawBitmap(bmp, xPos, yPos)
dc.DrawBitmap(bmp, 0, 0)
  • Ist flimmern, das Artefakt auf die Sie sich beziehen ? Ist dieses Problem gelöst, mit Doppel-gepufferte Zeichnung, speziell finden Sie unter wiki.wxpython.org/DoubleBufferedDrawing
  • Nein, nicht ein flackern. Eine 75% - ige Kopie des original-Bild bleibt nach einem Neuzeichnen. Das Ergebnis sieht aus wie zwei Quadrate (coloredf) überlappung von 25%. (Verallgemeinerung, das logo ist Platz)
  • bessere Erklärung. Original Bild löscht niemals. Neues Bild (nach Größe) in richtig gezeichnet ist, aber nun beide Bilder sind auf der Oberfläche. Seltsam genug, das neue Bild zieht unten (untere z-index), das alte Bild.
  • Mir scheint es die vorherigen link immer noch gilt. Haben Sie es ?
  • Wurde gerade gepostet, dass...der link auf die doppelte Pufferung Kreuze von dem gleichen Feld, aber nicht die Adresse löschen fehlgeschlagen Schritt. Auch (fehlgeschlagen zu beachten, dass diese oben) versucht haben, binden Sie diese zu EXT_SIZE und EVT_PAINT mit keinen Unterschied in den Ergebnissen.
  • OK, mit VIEL Gefummel habe ich die Doppelte Pufferung code zu beheben, Teil des Problems (das Artefakt ist Weg) aber jetzt ist der rest des Fensters ist "off", aber das kann behoben werden. Wenn Sie so freundlich sein würden, veröffentlichen Sie Ihren Vorschlag als Antwort, ich werden Kredit Sie. Vielen Dank für die Hilfe.
  • Unter OSX ist der erste code, den Sie geschrieben fast funktioniert. Ich hatte zu entfernen self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) weil Sie es war, die den Neuanstrich zu scheitern, alle Möglichkeiten (die Tasten waren nicht nicht Anzeige richtig, hintergrund Bild nie gezeigt).
  • Ich habe noch zwei Probleme mit dem neuen code (basierend auf Ihrem empfehlen), pflegt das image zeichnen, wenn das Fenster nicht mindestens bmp.GetSize()+1, und das zweite problem ist.....KANN ICH NICHT GEBEN IHNEN KREDIT FÜR DIE ANTWORT!! kleiner Tipp..Tipp..

InformationsquelleAutor Jase | 2012-12-09
Schreibe einen Kommentar