110 likes | 275 Views
Python - objekti in grafika. In še ena podrobnost o uvozu knjižnic. tkinter. Denimo, da bi radi narisali tako sliko. Ali gre s tkinter?. Seveda, končno smo narisali tudi. Vendar …. Koda je bila dokaj zapletena (vsaj "uvod") in nepregledna okno = tkinter.Tk ()
E N D
Python - objekti in grafika In še ena podrobnost o uvozu knjižnic
tkinter • Denimo, da bi radi narisali tako sliko
Ali gre s tkinter? • Seveda, končno smo narisali tudi
Vendar … • Koda je bila dokaj zapletena (vsaj "uvod") in nepregledna okno = tkinter.Tk() platno = tkinter.Canvas(okno, width=400, height=400, background='white') platno.pack() # nogi (nogi narišemo pred telesom, ker želimo da jih na sliki telo prekriva) platno.create_rectangle(140, 280, 160, 350, fill='pink', outline='black', width=2) platno.create_rectangle(240, 280, 260, 350, fill='pink', outline='black', width=2) # telo platno.create_oval(100, 100, 300, 300, fill='pink', outline='black', width=2) • Ali ne bi šlo pregledneje? • In kako bi npr. travnik pobelili (padel je sneg ;-) ) • Travnik – objekt • Mu "ukažemo" naj se pobeli • "tkinter" in njegove ukaze "zapakiramo v objekte" • Če pošteno pogledamo – objekte uporabljamo že sedaj! • platno.create_oval ... • Tkinter.Tk()
Naša hiša platno = Canvas(300, 200, 'skyBlue', 'Mojsvet') sonce = Circle(30, Point(250,50)) sonce.setFillColor('yellow') platno.add(sonce) fasada = Square(60, Point(140,130)) fasada.setFillColor('white') platno.add(fasada) dimnik = Rectangle(15, 28, Point(155,85)) dimnik.setFillColor('red') dimnik.setBorderColor('red') papir.add(dimnik ) Množica objektov, ki jim "ukazujemo"
Tehnična podrobnost … • To preimenovanje smo dosegli s knjižnico • cs1graphics.py (iz knjige Michael H. Goldwasser, David Letscher, Object-OrientedProgramming in Python) • Načeloma bi morali pisati • sonce = cs1graphics.Circle(30, cs1graphics.Point(250,50)) • from cs1graphics import * • Sedaj lahko cs1graphics. spustimo • Druga možnost: • import cs1graphics as GK • sonce = GK.Circle(30, GK.Point(250,50))
In tako kot iz osnovnih LEGO kock • In tako kot iz osnovnih LEGO kock znamo zgraditi npr. avto, hišo … • Iz večih hiš in avtomobilov pa mesto … • Lahko seveda tudi osnovne objekte "spakiramo" skupaj • Denimo, da bi pogosto potrebovali "prometni" znak za prepoved smeri – rumen krog znotraj rdečega. • Sestavimo ustrezni razred
Znaki.py from cs1graphics import * class PrepovedanPromet : def __init__(self, kam, x = 100, y = 100, r = 50, d = 5): self.notranji = Circle(r, Point(x, y)) self.notranji.setFillColor('yellow') kam.add(self.notranji) self.zunanji = Circle(r + d, Point(x, y)) self.zunanji.setFillColor('red') kam.add(self.zunanji)
In uporaba # Program: sonceInZnak.py from cs1graphics import * risba = Canvas(300, 200, 'skyBlue', 'različniobjekti') sonce = Circle(30, Point(250,50)) sonce.setFillColor('yellow') risba.add(sonce) žarekSW = Path(Point(225,75), Point(210,90)) žarekSW.setBorderColor('yellow') žarekSW.setBorderWidth(6) risba.add(žarekSW) žarekSE = Path(Point(275,75), Point(290,90)) žarekSE.setBorderColor('yellow') žarekSE.setBorderWidth(6) risba.add(žarekSE) … # in šeznak import znaki znak = znaki.PrepovedanPromet(risba, 100, 100, 40, 10)
In kako je nastala knjižnica cs1graphic? • Definicija razredov • Npr: class Circle(FillableShape): """A circle that can be drawn to a canvas.""" def __init__(self, radius=10, centerPt=None): … class Rectangle(FillableShape): """A rectangle that can be drawn to the canvas.""" def __init__(self, w=20, h=10, centerPt=None): • In kaj pomeni ImeRazreda(Nekaj)?
Na osnovi drugih razredov lahko tvorimo nove • Kaj pa, če je razred, ki je na voljo, sicer v redu, ampak mu nekaj manjka, ali pa "malenkostno narobe" • Npr. pri članih kluba bi bilo dobro imeti še podatek o njegovi funkciji • Pri ulomki pa bi bilo lažje, če bi bila števec in imenovalec vedno pozitivna, in bi imeli še poseben podatek o predznaku • Pri datumu bi radi, da vsebuje še čas …