Angeregt durch die Arbeiten am OSZ Handel (Spolwig, Penon u.a.) wurde eine Klassenbibliothek für die objektorientierte Programmierung im Anfängerunterricht realisiert. Am Oberstufenzentrum existieren entsprechenden Versionen für die Programmierung in Java und in Delphi. An Hand der Klassenbeschreibungen wurde eine weitgehend anwendungskompatible Version in Python geschrieben. Dabei ist festzustellen, dass unter python entsprechende Grafikklassen schon existieren. Um aber möglichst mit gleichen Bezeichnern arbeiten zu können, wurde eine neue Programmierung durchgeführt.
Hier zunächst eine kleine Beschreibung der Klassen: hier klicken!
Hier nun der komplette Quelltext. Wenn Sie einige kleine Testprogramme kennenlernen wollen, die dieses Tool anwenden, so klicken Sie bitte HIER. Dort können Sie auch die zugehörigen Bildschirmphotos betrachten!
# Die Grafik-Klassen in graph.py #! /usr/bin/python import Tkinter from Tkconstants import * import Canvas class Image: """ /* Bildklasse """ def __init__(self,Name): """ /* Name: string : Dateiname des Bildes """ self.Bild=Tkinter.PhotoImage(file=Name) self.Breite=self.Bild.width() self.Hoehe=self.Bild.height() def get_Bild(self): """ /* liefert das Bildobjekt für 'image' in Canvas.ImageItem /* (Darstellung des Bildes auf einer Zeichenfläche) """ return self.Bild def get_Breite(self): """ /* liefert die Bildbreite in Pixeln """ return self.Breite def get_Hoehe(self): """ /* liefert die Bildhoehe in Pixeln """ return self.Hoehe class TColor: """ /* erste primitive Version mit nur wenigen Farben /* Die Farben können über die deutschen Namen oder über /* Zahlen abgerufen werden /* Hinweis: "#fff" entspricht "weiss", /* statt "#xxx" kann auch "red", "green" usw. benutzt werden /* andere Lösungen mit true-colors sind denkbar """ def __init__(self): """ /* transparent, schwarz, blau, gruen, tuerkis, rot, gelb, grau, weiss """ self.Fnamen = { \ 0:"transparent", \ 1:"schwarz" , \ 2:"blau" , \ 3:"gruen" , \ 4:"tuerkis" , \ 5:"rot" , \ 6:"gelb" , \ 7:"grau" , \ 8:"weiss" \ } self.Farbe={ \ "transparent":"", \ "schwarz" :"#000", \ "blau" :"#00f", \ "gruen" :"#0f0", \ "tuerkis" :"#0ee", \ "rot" :"#f00", \ "gelb" :"#ff0", \ "grau" :"#ccc", \ "weiss" :"#fff" \ } def getColor(self,nr): """ /* nr : int : 0 .. 8 für die oben angegebenen Farben /* liefert die Farbdarstellung für X """ return self.Farbe[self.getFarbnamen(nr)] def getFarbnamen(self,nr): """ /* nr : int : 0 .. 8 für die oben angegebenen Farben /* liefert den (deutschen) Bezeichner der Farbnummer (s.o.) """ return self.Fnamen[nr] def getFarbe(self,wort): """ /* wort : string : ein Element aus den oben angegebenen Farben /* liefert die Farbdarstellung fuer X """ return self.Farbe[wort] class TFigur: """ /* interne Hinweise: /* ZF ist Referenz auf Zeichenfläche, wird später gesetzt /* grafObj ist das aktuelle Grafikobjekt """ def __init__(self): """ /* Alle Grafik-Klassen erben von TFigur. TFigur wird beschrieben durch /* folgende Attribute: /* X1,Y1 (linke obere Ecke) /* X2,Y2 (rechte untere Ecke) /* Farbe /* Fuellfarbe """ self.X1=20 self.Y1=20 self.X2=100 self.Y2=100 self.Farben=TColor() self.Farbe=self.Farben.getColor(0) self.Fuellfarbe=self.Farben.getColor(0) def setPos(self,ax1,ay1,ax2,ay2): """ /* ax1,ay1 : int :(linke obere Ecke) /* ax2,ay2 : int :(rechte untere Ecke) """ self.X1=ax1 self.Y1=ay1 self.X2=ax2 self.Y2=ay2 def getXPos(self): """ /* liefert x-Wert der Position der linken oberen Ecke """ return self.X1 def getYPos(self): """ /* liefert y-Wert der Position der linken oberen Ecke """ return self.Y1 def setFarbe(self,F): """ /* F : string : deutscher Bezeichner (s.o.) """ self.Farbe=self.Farben.getFarbe(F) def getFarbe(self): """ /* gibt akt. Farbe zurück : string : Farbrepr. für X """ return self.Farbe def setFuellfarbe(self,F): """ /* F : string : deutscher Bezeichner (s.o.) """ self.Fuellfarbe=self.Farben.getFarbe(F) def getFuellfarbe(self): """ /* gibt akt. Füllfarbe zurück : string : Farbrepr. für X """ return self.Fuellfarbe def pos_versetzen_um(self,dx,dy): """ /* versetzt die Position des heweiligen Grafikobjektes um dx und dy """ self.X1=self.X1+dx self.X2=self.X2+dx self.Y1=self.Y1+dy self.Y2=self.Y2+dy def zeigen(self): """ /* zeigt das Grafikobjekt auf dem Schirm an """ pass def loeschen(self): """ /* löscht das Grafikobjekt auf dem Schirm """ self.grafObj.move(1000,1000) def entfernen(self): """ /* entfernt das Grafikobjekt aus dem Speicher """ self.grafObj.delete() class TLinie(TFigur): """ /* Klasse Linie """ def __init__(self): TFigur.__init__(self) x = self.getFarbe() self.grafObj=Canvas.Line(TFigur.ZF,(self.X1, self.Y1),(self.X2, self.Y2)\ , {"fill": x}) def zeigen(self): self.grafObj.config(fill=self.getFarbe()) self.grafObj.coords(((self.X1,self.Y1),(self.X2,self.Y2))) class TEllipse(TFigur): """ /* Klasse Ellipse """ def __init__(self): TFigur.__init__(self) x = self.getFarbe() y = self.getFuellfarbe() self.grafObj=Canvas.Oval(TFigur.ZF, (self.X1, self.Y1), \ (self.X2, self.Y2), {"outline": x, "fill": y}) def zeigen(self): self.grafObj.config(fill=self.getFuellfarbe(),outline=self.getFarbe()) self.grafObj.coords(((self.X1,self.Y1),(self.X2,self.Y2))) class TKreis(TFigur): """ /* Klasse Kreis """ def __init__(self): """ /* zus. Attribute sind hier: Radus, x-Mittelpunkt, y-Mittelpunkt """ TFigur.__init__(self) self.R=0 self.Mx=0 self.My=0 x = self.getFarbe() y = self.getFuellfarbe() self.grafObj=Canvas.Oval(TFigur.ZF, (self.X1, self.Y1), \ (self.X2, self.Y2), {"outline": x, "fill": y}) def __berechne_Standard(self): self.X1=self.Mx-self.R self.X2=self.Mx+self.R self.Y1=self.My-self.R self.Y2=self.My+self.R def setRadius(self,r): """ /* r : int : Radius """ self.R=r self.__berechne_Standard() def getRadius(self): """ /* liefert aktuelle Radiuslänge """ return self.R def setMPos(self,ax,ay): """ /* ax, ay : int /* setzt Mittelpunktskoordinaten """ self.Mx=ax self.My=ay self.__berechne_Standard() def zeigen(self): self.grafObj.config(fill=self.getFuellfarbe(),outline=self.getFarbe()) self.grafObj.coords(((self.X1,self.Y1),(self.X2,self.Y2))) class TRechteck(TFigur): """ /* Klasse Rechteck """ def __init__(self): TFigur.__init__(self) x = self.getFarbe() y = self.getFuellfarbe() self.grafObj=Canvas.Rectangle(TFigur.ZF, (self.X1, self.Y1), \ (self.X2, self.Y2), {"outline": x, "fill": y}) def zeigen(self): self.grafObj.config(fill=self.getFuellfarbe(),outline=self.getFarbe()) self.grafObj.coords(((self.X1,self.Y1),(self.X2,self.Y2))) class TText(TFigur): """ /* Klasse Text zur Beschriftung der Zeichenfläche """ def __init__(self): """ /* Attribute sind /* Text : string /* Schriftart : String (X-Fonts-Bezeichner) /* Zeichen-Hoehe : int : default = 10 """ TFigur.__init__(self) self.Text="" self.Schriftart="*" self.Hoehe=10 def setPos(self,ax,ay): """ /* ax, ay : int : Position des ersten Zeichens """ self.X1=ax self.Y1=ay def setText(self,Text): """ /* Text : string : auszugebender Text """ self.Text=Text def setFont(self,Art="*",Grad=10): """ /* Art : string : Font-Name /* Grad : int : Zeichengröße """ self.Schriftart=Art self.Hoehe=Grad def zeigen(self): self.grafObj=Canvas.CanvasText(TFigur.ZF, self.X1, self.Y1, \ anchor="w", fill=self.Farbe, font=(self.Schriftart, self.Hoehe)) self.grafObj.insert(0,self.Text) class TZeichenblatt: """ /* Zeichenblatt entspricht Canvas. Mit Init wird ein Bild unterlegt /* Zeichenblatt vom Typ TZeichenplatt wird erzeugt und steht zur /* Verfügung. """ def __init__(self): pass def Init(self,Name): """ /* Init hinterlegt das Bild /* Name : string : Dateiname (gif) """ self.oWindow=Tkinter.Tk() self.oWindow.title("Zeichenfläche - nach S. Spolwig ----- Kokavecz") self.oBild=Image(Name) self.X1=0 self.Y1=0 self.X2=self.oBild.get_Breite() self.Y2=self.oBild.get_Hoehe() Geometrie=str(self.X2)+"x"+str(self.Y2)+"+0+0" self.oWindow.geometry(Geometrie) self.oEbene=Tkinter.Canvas(self.oWindow,relief=SUNKEN, bd=5, \ width=self.X2, height=self.Y2) bild=Canvas.ImageItem(self.oEbene,(0,0),anchor="nw", \ image=self.oBild.get_Bild()) self.oEbene.pack() TFigur.ZF=self.oEbene def get_Breite(self): """ /* liefert die Bildbreite in Pixeln """ return self.oBild.get_Breite() def get_Hoehe(self): """ /* liefert die Bildhoehe in Pixeln """ return self.oBild.get_Hoehe() def refresh(self): TFigur.ZF.update() # sollte oZeichenblatt oder mein_Zeichenblatt heißen: Zeichenblatt = TZeichenblatt()
Dr. Bernd Kokavecz