Einbindung von Bildern
Zielsetzung
Die Benutzeroberfläche soll attraktiver gestaltet werden, indem Würfelergebnisse nicht textuell, sondern grafisch dargestellt werden.
StaticBitmap-Objekte
Das folgende Testprogramm zeigt, wie man ein Bild in die Benutzeroberfläche einbinden kann.
# -*- coding: iso-8859-1 -*- from wx import * # Erzeugung des Fensters app = App() frame = Frame(parent=None) frame.SetTitle("Test") frame.SetSize((128, 145)) frame.SetBackgroundColour("white") frame.Show() # Rahmen Würfel panelWuerfel = Panel(parent=frame) panelWuerfel.SetSize((110, 100)) panelWuerfel.SetPosition((5, 5)) panelWuerfel.SetBackgroundColour("#FBD975") # Bild wuerfel1 = Bitmap('w1.gif') wB = StaticBitmap(panelWuerfel, -1, wuerfel1, (40, 35)) frame.Refresh() # Aktivierung des Fensters app.MainLoop()
Dieses Testprogramm erzeugt die folgende Benutzeroberfläche.
Im vorliegenden Testprogramm wird ein Pixelgrafik-Bild mit Hilfe eines Bitmap
-Objekts
verwaltet.
Mit Hilfe eines StaticBitmap
-Objekts wird das Bild dann auf der Benutzeroberfläche dargestellt.
Beachte, dass mit frame.Refresh()
die Benutzeroberfläche neu gezeichnet wird, um das Bild
richtig darzustellen.
Aufgabe 1
Das folgende Programm zeigt, wie man Bilder dynamisch wechseln kann.
# -*- coding: iso-8859-1 -*- from wx import * from random import * # Ereignisverarbeitung def Button_Wuerfel_Click(event): # Verwaltung und Verarbeitung der Daten wuerfelB = randint(1,6) # Anzeige der Daten if wuerfelB == 1: wB.SetBitmap(wuerfel1) elif wuerfelB == 2: wB.SetBitmap(wuerfel2) elif wuerfelB == 3: wB.SetBitmap(wuerfel3) elif wuerfelB == 4: wB.SetBitmap(wuerfel4) elif wuerfelB == 5: wB.SetBitmap(wuerfel5) elif wuerfelB == 6: wB.SetBitmap(wuerfel6) frame.Refresh() # Erzeugung des Fensters app = App() frame = Frame(parent=None) frame.SetTitle("Test") frame.SetSize((128, 145)) frame.SetBackgroundColour("white") frame.Show() # Rahmen Würfel panelWuerfel = Panel(parent=frame) panelWuerfel.SetSize((110, 100)) panelWuerfel.SetPosition((5, 5)) panelWuerfel.SetBackgroundColour("#FBD975") # Label mit Überschrift für die Würfel stUeberschriftWuerfel = StaticText(parent=panelWuerfel, style=ALIGN_CENTRE|ST_NO_AUTORESIZE) stUeberschriftWuerfel.SetLabel("Würfel") stUeberschriftWuerfel.SetSize((100, -1)) stUeberschriftWuerfel.SetPosition((5, 5)) stUeberschriftWuerfel.SetBackgroundColour("white") # Bild wuerfel1 = Bitmap('w1.gif') wuerfel2 = Bitmap('w2.gif') wuerfel3 = Bitmap('w3.gif') wuerfel4 = Bitmap('w4.gif') wuerfel5 = Bitmap('w5.gif') wuerfel6 = Bitmap('w6.gif') wB = StaticBitmap(panelWuerfel, -1, wuerfel1, (40, 35)) frame.Refresh() # Button zum Würfeln bWuerfel = Button(parent=panelWuerfel) bWuerfel.SetLabel("Würfel werfen") bWuerfel.SetPosition((5, 75)) bWuerfel.SetSize((100, 20)) bWuerfel.Bind(EVT_BUTTON, Button_Wuerfel_Click) # Aktivierung des Fensters app.MainLoop()
Wenn man die Schaltfläche anklickt, dann wird das nächste Würfelergebnis mit dem zugehörigen Bild dargestellt.
Ergänze das Programm so, dass alle drei Würfelergebnisse mit geeigneten Bildern angezeigt werden.
Aufgabe 2
Die Anzeige des jeweils passenden Bildes in der Prozedur Button_Wuerfel_Click
ist nicht elegant gelöst.
Die folgende Programmversion zeigt eine bessere Lösung. Was ist hier anders gemacht?
# -*- coding: iso-8859-1 -*- from wx import * from random import * # Ereignisverarbeitung def Button_Wuerfel_Click(event): # Verwaltung und Verarbeitung der Daten wuerfelB = randint(1,6) # Anzeige der Daten wB.SetBitmap(wuerfelbilder[wuerfelB-1]) frame.Refresh() # Erzeugung des Fensters app = App() frame = Frame(parent=None) frame.SetTitle("Test") frame.SetSize((128, 145)) frame.SetBackgroundColour("white") frame.Show() # Rahmen Würfel panelWuerfel = Panel(parent=frame) panelWuerfel.SetSize((110, 100)) panelWuerfel.SetPosition((5, 5)) panelWuerfel.SetBackgroundColour("#FBD975") # Label mit Überschrift für die Würfel stUeberschriftWuerfel = StaticText(parent=panelWuerfel, style=ALIGN_CENTRE|ST_NO_AUTORESIZE) stUeberschriftWuerfel.SetLabel("Würfel") stUeberschriftWuerfel.SetSize((100, -1)) stUeberschriftWuerfel.SetPosition((5, 5)) stUeberschriftWuerfel.SetBackgroundColour("white") # Bild wuerfelbilder = [ \ Bitmap('w1.gif'), \ Bitmap('w2.gif'), \ Bitmap('w3.gif'), \ Bitmap('w4.gif'), \ Bitmap('w5.gif'), \ Bitmap('w6.gif') \ ] wB = StaticBitmap(panelWuerfel, -1, wuerfelbilder[0], (40, 35)) frame.Refresh() # Button zum Würfeln bWuerfel = Button(parent=panelWuerfel) bWuerfel.SetLabel("Würfel werfen") bWuerfel.SetPosition((5, 75)) bWuerfel.SetSize((100, 20)) bWuerfel.Bind(EVT_BUTTON, Button_Wuerfel_Click) # Aktivierung des Fensters app.MainLoop()
Aufgabe 3
Ändere die Benutzeroberfläche zum chuck-a-luck-Spiel so ab, dass alle Würfelergebnisse grafisch dargestellt werden.
Beachte, dass bei der Ermittlung des Gewinns auf die Würfelergebnisse zurückgegriffen werden muss. Der folgende Programmauszug (zur Programmversion aus Aufgabe 1) zeigt, wie man das machen kann.
def Button_Gewinn_Click(event): # Verwaltung der Daten if wA.GetBitmap() == wuerfel1: wuerfelA = 1 elif wA.GetBitmap() == wuerfel2: wuerfelA = 2 elif wA.GetBitmap() == wuerfel3: wuerfelA = 3 elif wA.GetBitmap() == wuerfel4: wuerfelA = 4 elif wA.GetBitmap() == wuerfel5: wuerfelA = 5 elif wA.GetBitmap() == wuerfel6: wuerfelA = 6 if wB.GetBitmap() == wuerfel1: wuerfelB = 1 elif wB.GetBitmap() == wuerfel2: wuerfelB = 2 elif wB.GetBitmap() == wuerfel3: wuerfelB = 3 elif wB.GetBitmap() == wuerfel4: wuerfelB = 4 elif wB.GetBitmap() == wuerfel5: wuerfelB = 5 elif wB.GetBitmap() == wuerfel6: wuerfelB = 6 if wC.GetBitmap() == wuerfel1: wuerfelC = 1 elif wC.GetBitmap() == wuerfel2: wuerfelC = 2 elif wC.GetBitmap() == wuerfel3: wuerfelC = 3 elif wC.GetBitmap() == wuerfel4: wuerfelC = 4 elif wC.GetBitmap() == wuerfel5: wuerfelC = 5 elif wC.GetBitmap() == wuerfel6: wuerfelC = 6 konto = int(stKonto.GetLabel()) ...
Das Zugriffproblems ist hier nicht elegant gelöst. Eine bessere Lösung wirst du in Abschnitt ... kennen lernen.