Pythonmania

Script Different!

Suchen in:
Suche:
In Partnerschaft mit Amazon.de
Startseite | Schockwellenreiter | Impressum
Anzeigen


wxPython Tutorial (3): Wir laden ein Bild

Book Cover Es wird Zeit, daß ich mein wxPython-Tutorial fortsetze [1] [2]. Heute möchte ich zeigen, wie man in wxPython ein Bild in ein Fenster lädt. Dazu definieren wir uns — wie in nahezu jedem wxPython-Programm, erst einmal einen Frame, der das Bild enthalten soll. Dieses Bild wird dort auch schon geladen. Man merkt dann deutlich an, daß das wx-Toolkit seine Wurzeln in Unix unter X hat, denn um das Bild anzuzeigen, benötigt es dieses als eine (X-) Bitmap. Dies kann uns jedoch egal sein, da die Methode ConvertToBitmap() dies für uns erledigt.

Dann erstellen wir eine Klasse PaintWindow, die wir von wxWindow ableiten. Diese Terminologie ist ein wenig gewöhnungsbedürftig: Ein Window ist in der wx-Terminologie das, was in anderen GUI-Toolkits ein Widget ist. Was wir gemeinhin unter Window verstehen, entspricht im wx-Jargon eher einem Frame. Beim Initialisieren der Klasse legen wir fest, daß unsere Methode OnPaint() immer dann aufgerufen wird, wenn unser Fenster ein Paint-Event verschickt. Die Methode OnPaint() zeichnet einfach das Bild.

Hier nun der Quelltext:


#! /usr/bin/pythonw
import wx
filename = "/Users/kantel/Documents/lorrain6.jpg"

class TestFrame(wx.Frame):
  def __init__(self):
    wx.Frame.__init__(self, None, title="Das Urteil 
        des Paris", size=(702, 546))
    img = wx.Image(filename)
    win = PaintWindow(self, img)

class PaintWindow(wx.Window):
  def __init__(self, parent, image):
    wx.Window.__init__(self, parent)
    self.pic = image.ConvertToBitmap()
    self.Bind(wx.EVT_PAINT, self.OnPaint)

  def OnPaint(self, evt):
    dc = wx.PaintDC(self)
    dc.Clear()
    dc.DrawBitmap(self.pic, 1, 1, True)

if __name__ == "__main__":
  app = wx.PySimpleApp()
  frm = TestFrame()
  frm.Show()
  app.MainLoop()

Bei der Festlegung der Rahmengröß müssen wir darauf achten, daß oben etwa 22 Pixel für die Titelleiste des Rahmens mit eingerechnet werden müssen. Der Rest folgt altbekanntem Schema: Wenn das Modul als eigenständiges Programm läuft, dann wird eine Instanz von PySimpleApp() initialisiert, dann eine Instanz unseres Frames. Dieser Frame wird angezeigt und dann geht das wxPython-Programm in seine MainLoop und wartet auf den User-Input. Im Endeffekt sieht das dann so aus (Klick für eine Vergrößerung):

Screenshot

Wir können den Rahmen beliebig vergrößern oder verkleinern, das Bild wird immer korrekt neu gezeichnet. Da wir noch keine eigene Exit-Routine festgelegt haben, beendet sich das Programm nach dem Schließen des Fensters.

Ist doch einfach, oder?

Technorati-Tags:

Posted by Jörg Kantel | Permalink | | | Python






Werbung: