Logo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

Einstieg - Würfeln

Grafische Benutzeroberfläche zum Würfel

Wir gehen hier von einem sehr einfachen Datenmodell aus. Ein Würfel soll durch ein Objekt der Klasse Wuerfel dargestellt werden. Die Klasse Wuerfel ist dabei wie folgt definiert:

from random import randint

class Wuerfel(object):
    def __init__(self):
        self.augen = 1

    def werfen(self):
        self.augen = randint(1, 6)

Ziel ist es, eine einfache grafische Benutzeroberfläche zu erzeugen, von der aus ein Objekt der Klasse Wuerfel aktiviert werden kann.

Grafische Benutzeroberfläche

GUI-Objekte und Datenmodellobjekte

Der folgende Quelltext zeigt, wie man eine grafische Benutzeroberfläche zu einem bereits implementierten Datenmodell erstellt. Wir setzen voraus, dass die Klasse Wuerfel in einer Datei wuerfel.py abgespeichert ist, die sich im selben Verzeichnis wie die Datei mit dem folgenden Quelltext befindet.

#-----------------------------------------------------------
# Datenmodell
#-----------------------------------------------------------

from wuerfel import *
wuerfel = Wuerfel()

#-----------------------------------------------------------
# GUI
#-----------------------------------------------------------

from tkinter import *

# Ereignisverarbeitung

def Button_Wuerfel_Click():
    # Verarbeitung der Daten
    wuerfel.werfen()
    # Anzeige der Daten
    labelWuerfel.config(text=str(wuerfel.augen))

# Erzeugung des Fensters
fenster = Tk()
fenster.title("Würfel")
fenster.geometry('120x110')
# Schriftfeld für den Würfel
labelWuerfel = Label(master=fenster, 
                   text=str(wuerfel.augen), 
                   background="#FBD975")
labelWuerfel.place(x=45, y=40, width=30, height=30)
# Button zum Auswerten
buttonWuerfel = Button(master=fenster, 
                       text="Würfel werfen", 
                       command=Button_Wuerfel_Click)
buttonWuerfel.place(x=10, y=80, width=100, height=20)
# Aktivierung des Fensters
fenster.mainloop()

Aufgabe 1

Teste zunächst das Programm. Mache dich auch mit dem Quelltext vertaut. Analysiere insbesondere die Ereignisverarbeitungsprozedur. Ergänze das Programm so, dass man das Werfen von drei Würfeln simulieren kann.

Ein Objekt zur Verwaltung der GUI-Objekte

Der folgende Quelltextauszug zeigt eine andere Implementierung der grafischen Benutzeroberfläche. Hier wird ein zusätzliches Objekt benutzt, um sämtliche GUI-Objekte zu verwalten.

from tkinter import *

class GUIWuerfel(object):
    def __init__(self, wuerfel):
        # Referenzattribute zum Datenmodell
        self.wuerfel = wuerfel
        # Erzeugung des Fensters
        self.fenster = Tk()
        self.fenster.title("Würfel")
        self.fenster.geometry('120x110')
        # Schriftfeld für den Würfel
        self.labelWuerfel = Label(master=self.fenster, text=str(self.wuerfel.augen), bg="#FBD975")
        self.labelWuerfel.place(x=45, y=40, width=30, height=30)
        # Button zum Auswerten
        self.buttonWuerfel = Button(master=self.fenster, text="Würfel werfen",
                                    command=self.Button_Wuerfel_Click)
        self.buttonWuerfel.place(x=10, y=80, width=100, height=20)

    def Button_Wuerfel_Click(self):
        # Verarbeitung der Daten
        self.wuerfel.werfen()
        # Anzeige der Daten
        self.labelWuerfel.config(text=str(self.wuerfel.augen))

Die Erzeugung des GUI-Verwaltungsobjekts und des Datenmodellobjekts kann jetzt in einem eigenen Testprogramm erfolgen.

#-----------------------------------------------------------
# Datenmodell
#-----------------------------------------------------------

from wuerfel import *
wuerfel = Wuerfel()

#-----------------------------------------------------------
# GUI-Objekt
#-----------------------------------------------------------

from guiwuerfel import *
guiwuerfel = GUIWuerfel(wuerfel)
guiwuerfel.fenster.mainloop()

Aufgabe 2

(a) Teste das Programm.

(b) Welche Beziehungen bestehen zwischen den Objekten? Verdeutliche dies mit einem Objekt- und Klassendiagramm.

X

Fehler melden

X

Suche