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.

Anwendungsfenster

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.

Test

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.

Test

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.

Anwendungsfenster
X

Fehler melden

X

Suche