Problem mit Plattformunabhängigkeit mit wx.BitmapFromImage

Plattformunabhängige GUIs mit wxWidgets.
Antworten
quiver
User
Beiträge: 4
Registriert: Freitag 26. März 2010, 13:58

Hallo Zusammen,
ich bin relativ neu hier und auch was GUI Programmierung angeht aber ich bin bei meinem derzeitigen Projekt über etwas gestolpert wo ich nicht mehr weiter komme:

Ich bin dabei eine Echtzeitdarstellung eines Audiosignals (mittels pyaudio) zu implementieren. Was ich machen wollte funktioniert auch alles Prima.... jedoch leider nur unter OSX und Windows! Auf meiner Ubuntu Kiste funktioniert es zwar auch aber das Bild schaut total "pixlig" aus.

Hier ist was ich mache.... ich habe ein Frame von fixer Größe

Code: Alles auswählen

class RealTimeSonarFrame(wx.Frame):
    def __init__(self, parent, id, title):
...
        self.panel = SonarPanel(self,self.config)
        self.timer = wx.Timer(self)

        self.SetMinSize((900, 200))
        self.SetMaxSize((900, 200))

        self.timer.Start(50)
...
    def on_timer(self, event):
        self.panel.update_drawing()

Und ein Panel welches ich mittels dem timer im frame refreshed (==paint event) wird

Code: Alles auswählen

class SonarPanel(wx.Window):
    def __init__(self, parent, config):
...
          self.Bind(wx.EVT_PAINT, self.on_paint)
...

    def update_drawing(self):
        self.Refresh(False)
        

    def on_paint(self, event):
        dc = wx.AutoBufferedPaintDC(self)
        dc.Clear()
        width, height = self.GetClientSize()
        
        self.mySonar.draw(dc)
         
Und ein Objekt welches sich selber zeichnet (dies beinhaltet ein wx.Image welches ich manipuliere und dann auf den dc zeichnen lasse)... soweit nix neues! Ich will euch nicht langweilen :?

Code: Alles auswählen

class Sonargram(object):
    
    def __init__(self, size, config):
...
          self.myIMG = wx.EmptyImage(self.size.x,self.size.y)
...

    def draw(self,dc):
        
        newImg = self.myIMG.GetSubImage(wx.Rect(self.oldFFTlen, 0, self.size.x-self.oldFFTlen, self.size.y))       
        self.myIMG.Paste(newImg,0,0)
        
        for i in range(0,len(self.fftData)):
            for j in range(0,self.size.y):
                ampl = self.fftData[i][self.size.y-j]
                invAmpl = 255-ampl
                if invAmpl < 0 or invAmpl > 255:

                    self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,0,0,0)
                else:
                    if self.config.color == 'red':
                        print 'sdfs'
                        self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,invAmpl,0,0)
                    elif self.config.color == 'green':
                        self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,0,invAmpl,0)
                    elif self.config.color == 'blue':
                        self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,0, 0, invAmpl)
                    elif self.config.color == 'gray':
                        self.myIMG.SetRGB(self.size.x-len(self.fftData)+i,j,invAmpl,invAmpl,invAmpl)
                        
        dc.DrawBitmap(wx.BitmapFromImage(self.myIMG),0,0)
        self.oldFFTlen = len(self.fftData)

        self.fftData = []

Es soll ein Bild darstellen das von rechts nach link über den Bildschirm läuft (und wie gesagt das tut es auch einwandfrei unter Windows und OSX....). Mahle ich direkt auf den dc mit:

Code: Alles auswählen

dc.SetPen(wx.Pen(wx.Color(invAmpl,0,0),2))
dc.DrawPoint(self.size.x-len(self.fftData)+i,j)
Funktioniert das auf allen Plattformen... aber:

Code: Alles auswählen

dc.DrawBitmap(wx.BitmapFromImage(self.myIMG),0,0)
Eben nicht?!? Ich will aber nicht immer das ganze Bild neu berrechnen da dann alles anfängt zu ruckeln und ich gedacht hab das ich es in einem wx.Image halte und dann den neuen Teil hinten dran hänge und eben mit:

Code: Alles auswählen

newImg = self.myIMG.GetSubImage(wx.Rect(self.oldFFTlen, 0, self.size.x-self.oldFFTlen, self.size.y))       
self.myIMG.Paste(newImg,0,0)
Die Verschiebung erziele (war auch richtig gedacht... aber eben nicht unter Linux (unter SuSe hab ich das gleiche Problem...))

Hat einer von euch eine Idee????? Ich komm einfach nicht weiter!

1000 Dank schon mal
quiver
User
Beiträge: 4
Registriert: Freitag 26. März 2010, 13:58

STOP STOP STOP.... ich bin ein Vollpfosten! Ein richtiger Vollpfosten....! Tipp an alle: Nicht nur auf einer oder mehreren VMs entwickeln.... nativ gehts! Ich Volldepp... sorry sorry sorry...
Antworten