Kapitel 17
Grafik
518
Aufgabe 2
Entwickeln Sie einen Funktionsplotter, der folgendermaßen arbeitet: In ein Eingabefenster
kann man für eine Funktion
f eine Berechnungsvorschrift für die Funktionswerte eintra-
gen. Es handelt sich um einen mathematischen Term mit einer Variablen
x. Nach einem
Klick auf die Schaltfläche P
LOT wird der Graph der Funktion in ein Koordinatensystem ein-
getragen. Dabei werden die Punkte
(x, f(x)) für ganzzahlige x zwischen –5 und 5 exakt
berechnet und durch gerade Linien verbunden (Abbildung 17.13).
Abb. 17.13: Ein einfacher Funktionsplotter
17.6 Lösungen
Lösung 1
Skript:
from tkinter import *
from PIL import Image, ImageTk
DATEN = [('Festung von Bodrum',
'bilder/bodrum.png'),
('Im Reallabor des Futuriums (Berlin)',
'bilder/futurium.png')] #1
class Galerie: #2
def __init__(self):
self.daten = DATEN
self.nr = 0
def nächstes(self): #3
self.nr = (self.nr +1) % len(self.daten)
519
17.6
Lösungen
Erläuterung:
#1: Die Pfade der Bilddateien und zugehörige Texte werden in einer Liste aus Tupeln gespei-
chert.
#2: Die Klasse Galerie modelliert die Bildersammlung.
#3: Die Methode liefert das nächste Element der Datenliste (Text und Pfad der Bilddatei).
Diese Liste wird zyklisch durchlaufen, das heißt, nach dem letzten Item kommt wieder das
erste.
#4: Auf den (anonymen) Button wird ein Icon mit einer Art Dreieck gesetzt. Beachten Sie,
dass die Größe des Buttons sich an die Bildgröße anpasst. Wenn man auf den Button klickt,
wird die Methode
self.weiter() aufgerufen.
#5: Text und Pfad der Datei des nächsten Bildes werden aus der Galerie geholt.
#6: Mithilfe des Pfades wird zunächst ein Image-Objekt erzeugt. Dieses Objekt ist lokal und
kein Attribut des Projektor-Objektes.
return self.daten[self.nr]
class Projektor:
def __init__(self):
self.fenster = Tk()
self.galerie = Galerie()
self.LabelBild = Label(self.fenster)
self.LabelBild.pack()
self.LabelText = Label(self.fenster, width=25,
font=('Arial', 10))
self.LabelText.pack()
icon=PhotoImage(file='bilder/weiter.gif')
Button(self.fenster,image=icon,
command=self.weiter).pack() #4
self.weiter()
self.fenster.mainloop()
def weiter(self):
text, bilddatei = self.galerie.nächstes() #5
img = Image.open(bilddatei) #6
self.imgTk = ImageTk.PhotoImage(img) #7
self.LabelBild.config(image=self.imgTk) #8
self.LabelText.config(text=text)
p = Projektor()
Kapitel 17
Grafik
520
#7: Ein PhotoImage-kompatibles Objekt wird erzeugt und mit dem Präfix self. zum Attri-
but des
Projektor-Objektes gemacht. Das ist wichtig, damit das Bild auf dem Label auch
sichtbar ist.
#8: Die beiden Labels werden neu konfiguriert. Sie erhalten ein neues Bild bzw. neuen Text.
Lösung 2
Skript:
# plotter.pyw
from tkinter import *
class Plotter:
def __init__(self):
fenster = Tk()
f = Frame(fenster) #1
f.pack(padx=5, pady=5)
self.term = StringVar() #2
self.term.set('0')
Label(f, text='f(x)= ').pack(side=LEFT)
self.e = Entry(f, width=12, textvariable=self.term,
font=('courier', 10))
self.e.pack(side=LEFT)
Button(f, text=' Plot ',
command=self.plot).pack(side=RIGHT, padx=5)
self.c = Canvas(fenster, width=160, height=160, bg='white') #3
self.c.pack(pady=5) #4
self.c.create_line(10,80,150,80, arrow=LAST, fill='blue')
self.c.create_line(80,10,80,150, arrow=FIRST, fill='blue')
self.c.create_text(90,90,text='1') #5
self.linie = self.c.create_line(30, 80, 130, 80, width=2)
fenster.mainloop()
def plot(self):
f = {}
try:
for x in range(-5, 6, 1): #6
f[x] = 80 – 10 * eval(self.term.get())
self.c.coords(self.linie,
30, f[-5], 40, f[-4], 50, f[-3], 60, f[-2],
70, f[-1], 80, f[0], 90, f[1], 100, f[2],
110, f[3], 120, f[4], 130, f[5]) #7
except: self.term.set('Ung\xfcltig!') #8
521
17.6
Lösungen
Erläuterung:
#1: Frame, der die Widgets für die Eingabe enthält (Label, Entry und Button).
#2: Kontrollvariable für das Entry-Widget. Sie erhält den Anfangswert '0'.
#3: Canvas mit weißem Hintergrund für das Diagramm.
#4: Es folgt die Definition der beiden Pfeile des Koordinatenkreuzes.
#5: Unter der x-Achse wird die Einheit des Koordinatensystems angedeutet. In der folgen-
den Zeile wird für die Anfangssituation (
f(x)=0) eine gerade Linie auf die x-Achse gelegt.
Sie ist schwarz (Default) und zwei Pixel weit.
#6: In einer for-Schleife werden die Funktionswerte für ganzzahlige x-Werte zwischen –5
und 5 ermittelt und direkt in y-Koordinaten für die Darstellung des Graphen auf dem Can-
vas umgerechnet. Die Ergebnisse werden im Dictionary
f gespeichert.
#7: Die Koordinaten der Eckpunkte der Linie auf dem Canvas (also der Graph) werden neu
konfiguriert. Die übrigen Attribute des Items mit ID-Nummer
self.linie bleiben unver-
ändert.
#8: Falls beim Versuch, den Term im Entry-Feld auszuwerten, ein Fehler auftrat, wird die
Meldung
ungültig im Entry-Feld ausgegeben.
p = Plotter()

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.