2012-12-04 7 views
5

Il mio progetto wxPython ha una cornice, con più sizers annidati.wxpython: ridimensiona automaticamente un'immagine statica (staticbitmap) per adattarla alla dimensione

Uno dei sizers contiene una wxStaticImage con una bitmap che viene letta da un file.

Ho bisogno che l'immagine venga ridimensionata (crescente/ristretta) ogni volta che il fotogramma viene ridimensionato, quindi si adatta ai suoi confini.

(penso che) so come ridimensionare un'immagine. Quello che non so è come:

  • come ottenere larghezza o l'altezza del contenitore dell'immagine?
  • forse ho trascurato una proprietà che lo fa auotmaticamente?

(per ora, non mi dispiace le proporzioni)

Edit: Soluzione completa

  1. ho capito sbagliato su wxStaticBitmapin.Size. NON descrive la dimensione dell'immagine (vale a dire la risoluzione dell'immagine), ma piuttosto - wxStaticBitmapin.Size fornisce le dimensioni dello slot del misuratore o in altre parole: la dimensione del widget corrente.

    quindi con il codice di Mik ora come inserirmi nello slot.

  2. in aggiunta a una soluzione di Mike: quando si utilizza evento OnSize su un telaio, non dimenticate di aggiungere event.Skip(). altrimenti i calibratori smetteranno di riallineare. Altertanively, usa semplicemente onSize dell'immagine.

ecco il metodo evento complete:

def bitmap1_onSize(self, e=None): 
    W, H = self.bitmap1.Size 
    if W > H: 
     NewW = W 
     NewH = W * H/W 
    else: 
     NewH = H 
     NewW = H * W/H 
    img = wx.Image(self.frame_file_picker.Path, wx.BITMAP_TYPE_ANY) 
    img = img.Scale(NewW,NewH) 
    self.bitmap1.SetBitmap(wx.BitmapFromImage(img)) 
    e.Skip() 
+0

Mi chiedo che ora ci sia una classe derivata che implementa questo. Questo caso d'uso non è così insolito, penso. – buhtz

risposta

6

Sarà necessario prendere EVT_SIZE o EVT_SIZING. Puoi dare un'occhiata a questo tutorial che ho scritto sulla creazione di un visualizzatore di immagini. In esso è presente un codice di ridimensionamento: http://www.blog.pythonlibrary.org/2010/03/26/creating-a-simple-photo-viewer-with-wxpython/

Vorrei semplicemente prendere il codice di scalatura e usarlo per aggiornare l'immagine. Dovrai assicurarti di smettere di ridimensionare l'immagine oltre la sua dimensione massima, altrimenti ti ritroverai con un sacco di pixelizzazione.

+0

grazie. vedi la soluzione completa all'interno della mia domanda –