Eine Leinwand für Grafiken
Zielsetzung
Wenn bei einem Spiel kein Gewinn erzielt wird, dann soll dies durch einen Pfeil nach unten verdeutlicht werden. Andernfalls soll ein Pfeil nach oben gezeichnet werden.
Zeichenfläche als GUI-Objekte
Der folgende Quelltextauszug zeigt, wie man einfache Grafiken erzeugen kann.
# -*- coding: iso-8859-1 -*-
from wx import *
# Ereignisverarbeitung
def on_paint(event):
dc = PaintDC(panel)
dc.Clear()
dc.SetPen(Pen("BLACK", 1))
dc.DrawLine(20, 80, 20, 40)
dc.DrawLine(20, 40, 40, 20)
dc.DrawLine(40, 20, 60, 40)
dc.DrawLine(60, 40, 20, 40)
dc.DrawLine(20, 40, 60, 80)
dc.DrawLine(60, 80, 60, 40)
dc.DrawLine(60, 40, 20, 80)
dc.DrawLine(20, 80, 60, 80)
# Erzeugung des Fensters
app = App()
frame = Frame(parent=None)
frame.SetTitle("Test")
frame.SetSize((128, 145))
frame.SetBackgroundColour("white")
frame.Show()
# Rahmen
panel = Panel(parent=frame)
panel.SetSize((110, 100))
panel.SetPosition((5, 5))
panel.SetBackgroundColour("#FFCFC9")
panel.Bind(wx.EVT_PAINT, on_paint)
# Aktivierung des Fensters
app.MainLoop()
Beachte, dass das Panel-Objekt panel hier als Zeichenfläche benutzt wird.
Jedesmal, wenn die Benutzeroberfläche neu gezeichnet wird, wird auch die Ereignisverarbeitungsmethode
on_paint ausgeführt. Bei der Ausführung wird ein PaintDC-Objekt erzeugt, das
für das Zeichnen der Figuren (im Beispiel oben sind es Linien) zuständig ist.
Der folgende Quelltextauszug zeigt, wie man einfache Grafik dynamisch erzeugen kann.
# -*- coding: iso-8859-1 -*-
from wx import *
from random import randint
# Ereignisverarbeitung
def Button_Zeichnen_Click(event):
# Verarbeitung der Daten
zahl = randint(0, 1)
# Anzeige der Daten
stZahl.SetLabel(str(zahl))
frame.Refresh()
def on_paint(event):
dc = PaintDC(panelKonto)
zahl = int(stZahl.GetLabel())
if zahl > 0:
dc.SetPen(Pen("#FFCFC9"))
dc.DrawLine(20, 40, 20, 60)
dc.DrawLine(20, 60, 16, 56)
dc.DrawLine(20, 60, 24, 56)
dc.SetPen(Pen("black"))
dc.DrawLine(90, 60, 90, 40)
dc.DrawLine(90, 40, 86, 44)
dc.DrawLine(90, 40, 94, 44)
else:
dc.SetPen(Pen("black"))
dc.DrawLine(20, 40, 20, 60)
dc.DrawLine(20, 60, 16, 56)
dc.DrawLine(20, 60, 24, 56)
dc.SetPen(Pen("#FFCFC9"))
dc.DrawLine(90, 60, 90, 40)
dc.DrawLine(90, 40, 86, 44)
dc.DrawLine(90, 40, 94, 44)
# Erzeugung des Fensters
app = App()
frame = Frame(parent=None)
frame.SetTitle("Test")
frame.SetSize((128, 145))
frame.SetBackgroundColour("white")
frame.Show()
# Rahmen Konto
panelKonto = Panel(parent=frame)
panelKonto.SetSize((110, 100))
panelKonto.SetPosition((5, 5))
panelKonto.SetBackgroundColour("#FFCFC9")
panelKonto.Bind(wx.EVT_PAINT, on_paint)
# Label mit Überschrift
stUeberschriftZeichnen = StaticText(parent=panelKonto, style=ALIGN_CENTRE|ST_NO_AUTORESIZE)
stUeberschriftZeichnen.SetLabel("Zeichnen")
stUeberschriftZeichnen.SetSize((100, -1))
stUeberschriftZeichnen.SetPosition((5, 5))
stUeberschriftZeichnen.SetBackgroundColour("white")
# Label Zahl
stZahl = StaticText(parent=panelKonto, style=ALIGN_CENTRE|ST_NO_AUTORESIZE)
stZahl.SetLabel("0")
stZahl.SetFont(Font(14, NORMAL, NORMAL, NORMAL))
stZahl.SetSize((30, 25))
stZahl.SetPosition((40, 35))
stZahl.SetBackgroundColour("white")
# Button zum Zeichnen
bZeichnen = Button(parent=panelKonto)
bZeichnen.SetLabel("Zeichnen")
bZeichnen.SetPosition((5, 75))
bZeichnen.SetSize((100, 20))
bZeichnen.Bind(EVT_BUTTON, Button_Zeichnen_Click)
# Aktivierung des Fensters
app.MainLoop()
Wenn man die Schaltfläche anklickt, dann wird - je nach ermittelter Zufallszahl - ein Pfeil nach oben oder nach unten gezeichnet.
Beachte, dass mit frame.Refresh() die Benutzeroberfläche nach jedem Anklicken der Schaltfläche
neu gezeichnet wird.
Aufgabe 1
Erweitere das Programm zum chuck-a-luck-Spiel so, dass mit Hilfe eines Pfeiles angezeigt wird, ob ein Spiel gewonnen oder verloren wurde.