Kapitel 17
Grafik
500
17.1.3 Visualisieren mit Kreisdiagrammen
Mit Kreisdiagrammen können Anteile an einem Ganzen dargestellt werden. Das folgende
Skript implementiert eine Anwendung, die das Verhältnis zweier Zahlen zueinander durch
ein Kreisdiagramm veranschaulicht. Beim Klick auf den OK-Button wird das Kreisdia-
gramm neu gezeichnet (siehe Abbildung 17.3)
Abb. 17.3: Veranschaulichung durch ein Kreisdiagramm. Die Zahlenwerte sind die Anzahlen
männlicher (Anzahl 1) und weiblicher (Anzahl 2) Studenten in Deutschland im Jahr
2002.
style
Aussehen des Arc-Objektes:
ARC (Kreisbogen), CHORD (Kreisbogen mit Sehne), PIESLICE (Tortenstück,
voreingestellt)
width
Breite der Außenlinie, z.B. '0.1c' oder 2.
# kreisdiagramm.pyw
from tkinter import *
class Kreisdiagramm:
def __init__ (self):
self.fenster = Tk()
self.fenster.title('Kreisdiagramm')
self.anzeige = Anzeige(self.fenster) #1
self.eingabe = Eingabe(self.fenster, self.anzeige) #2
self.fenster.mainloop()
class Anzeige:
def __init__ (self, fenster):
self.c = Canvas(master=fenster,
width='4c',height='4c') #3
self.c.pack(side=RIGHT)
self.teil1 = self.c.create_arc(
Option Erklärung
Tabelle 17.4: Die wichtigsten Optionen eines Ellipsenausschnitts auf einem Canvas (Forts.)
501
17.1
Die tkinter-Klasse Canvas
'0.5c', '0.5c','3.5c','3.5c', fill='blue',
style=PIESLICE, start=90,extent=180) #4
self.teil2 = self.c.create_arc(
'0.5c','0.5c','3.5c','3.5c', fill='red',
style=PIESLICE, start=90,extent=-180)
def aktualisiere(self, z1, z2): #5
summe = z1 + z2
w1 = 360*z1/summe
w2 = -(360-w1)
self.c.itemconfigure(self.teil1, extent=w1) #6
self.c.itemconfigure(self.teil2, extent=w2)
class Eingabe:
def __init__ (self, fenster, anzeige):
self.anzeige = anzeige
self.f = Frame(fenster, relief=GROOVE, bd=2) #7
self.f.pack(padx=5, pady=5)
self.f1 = Frame(self.f)
self.f2 = Frame(self.f)
self.f1.pack()
self.f2.pack()
Label(self.f1,text='Anzahl 1:').pack(side=LEFT)
Label(self.f2,text='Anzahl 2:').pack(side=LEFT)
self.e1 = Entry(self.f1,width=8)
self.e1.pack(side=LEFT,padx=5, pady=2)
self.e2 = Entry(self.f2,width=8)
self.e2.pack(side=LEFT,padx=5, pady=2)
Label(self.f1,
width=2,bg='blue').pack(side=LEFT)
Label(self.f2, width=2,bg='red').pack(side=LEFT)
self.ok = Button(self.f,text='OK',
command=self.aktualisiere) #8
self.ok.pack(side=LEFT, padx=5, pady=5)
def aktualisiere(self): #9
if self.e1.get() and self.e2.get():
z1 = int(self.e1.get())
z2 = int(self.e2.get())
self.anzeige.aktualisiere(z1, z2)
k = Kreisdiagramm()
Kapitel 17
Grafik
502
Erläuterung:
Das UML-Klassendiagramm in Abbildung 17.4 zeigt die Struktur des Systems. Die Klasse
Eingabe enthält alle Komponenten zur Eingabe von Zahlen. Diese werden bei der Instanzi-
ierung in den linken Teil des Anwendungsfensters gepackt.
In der Klasse
Anzeige wird ein Canvas definiert, auf den das Kreisdiagramm gezeichnet
wird. Er erscheint im rechten Teil des Fensters.
Abb. 17.4: UML-Klassendiagramm des Programms kreisdiagramm.pyw
#1
: Hier wird ein Objekt der Klasse Anzeige instanziiert. Ihm wird als Argument der Name
des Applikationsfensters übergeben (
self.fenster), damit es sein Canvas-Widget selbst in
das Fenster-Objekt packen kann.
#2: Das Objekt der Klasse Eingabe erfährt die Namen des Anwendungsfensters
(
self.fenster) und des Anzeige-Objektes mit dem Kreisdiagramm (self.anzeige).
Denn der Hauptframe benötigt für das Layout den Namen seines Masters. Außerdem muss
das Eingabe-Objekt eine Botschaft zur Aktualisierung des Kreisdiagramms an das Anzeige-
Objekt schicken können.
#3: Ein quadratischer Canvas mit der Seitenlänge 4 cm wird erzeugt.
#4: Zwei gefüllte Halbkreise – einer blau und einer rot – werden auf den Canvas platziert,
so dass sie einen vollständigen Kreis ergeben. Beachten Sie, dass beide Kreisausschnitte
denselben Startwinkel besitzen. Aber das eine Segment erstreckt sich um 180 Grad nach
rechts (
extent=180) und das andere nach links (negativer Wert extent=-180).
#5: Die Methode berechnet aus den übergebenen Zahlen neue Winkel für die extent-
Optionen der Kreisausschnitte und konfiguriert die
extent-Optionen der beiden Canvas-
Items neu (
#6).
#7: Ein Frame self.f mit einer Rille als Rahmen wird generiert und links in das Anwen-
dungsfenster gepackt. Dieser Frame erhält (zum besseren Layouten der Widgets) noch zwei
Unterframes. In diese werden Labels und Entries platziert.
#8: Der OK-Button wird an die interne Methode aktualisiere() gekoppelt.
#9: Sofern die beiden Entries keine leeren Strings enthalten, werden die in ihnen enthalte-
nen Strings in ganze Zahlen umgewandelt und eine Botschaft zur Aktualisierung des Kreis-
Kreisdiagramm
Anzeige
Eingabe
Frame Label Entry
Canvas
Button
Tk

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.