面向对象与图形编程数据与操作:传统观点•数据类型–某种值的集合–运算(操作)的集合•计算就是对数据进行操作–数据与操作分离–数据是被动的,操作是主动的•例如:string类型–值是’abc’等–对串的操作有+,*,len()等–一系列对字符串操作函数3数据与操作:面向对象观点•对象(Object):集数据与操作于一身.–对象与一些信息相关–对象能对那些信息进行处理•计算:向对象发出请求操作的消息.–对象调用所需的操作•面向对象(Object-Oriented):软件系统由各种对象组成,对象之间通过消息进行交互.•现代软件系统几乎都是OO设计和实现.444OO基本概念•类(class):描述同类对象的共性–包含的数据•任何类型的数据,甚至可以是对其他类的对象–能执行的操作:方法(method)•对象(object):类的实例(instance)–同类的不同对象可有不同的数据值(实例变量),但能执行的操作是一样的•创建对象:使用类的构造器(constructor).类名(参量1,参量2,…)•消息:请求对象执行它的方法.对象.方法名(参量1,参量2,…)对象的方法•不同类的对象当然提供不同的操作•对象一般都提供读取它的实例变量值的方法,统称为accessor.–例如Point对象的getX()和getY(),Line对象的getP1()和getP2().•对象一般也提供修改其实例变量的方法,统称为mutator.–例如所有图形对象都有move(dx,dy)方法.5面向对象方法解决的问题•适合开发大规模的软件系统•如:我们想要为交大开发一个学生信息数据处理系统•我们保存入校学生的信息,在信息库中每个学生的信息称之为一条记录,这样每个学生就是一个实例对象。面向对象方法解决的问题•学生对象所包含的数据(类成员):–Name–IDnumber–Coursestaken–CampusAddress–HomeAddress–GPA–Etc.面向对象方法解决的问题•面向对象系统中的激活对象采用的是消息机制,即学生对象应该响应请求•对象中还应该有一个printCampusAddress(printDormitory)操作,当学生对象接收到信息时,他的输出带有自己的地址。面向对象方法解决的问题•教学系统中可以有多种类对象,如学生类、教师类、课程类、设备类等等,即对象可能与其它对象有关系•每个课程需要定义课程类对象:–Instructor–Studentroster–Prerequisitecourses–Whenandwheretheclassmeets面向对象方法解决的问题•与学生对象相关的操作–addStudent–delStudent–changeRoom–Etc.classTime{public:time(inthour,intminute,intsec);voidset_time();voidshow_time();private:inthour;intminute;intsec;};面向对象程序设计方法的概述•现代计算机编程大多基于面向对象的方法。•我们所涉及的大部分应用都是GraphicalUserInterfaces(GUI),它提供一些基本元素windows,icons,buttonsandmenus。•这本教材相关的处理图形的图形库是graphics.py(在课件网站上有),它是基于Tkinter,将其拷入Python安装目录的根目录下即可,如:c:\python27\graphics.py。图形编程•图形用户界面(GUI)•图形编程接口–Python的标准库:Tkinter–本书作者写的图形库:graphics.py•使用图形编程接口–导入importTkinter#导入Tkinter库fromTkinterimport*#导入库中所有图形函数–调用其中的函数编写图形程序12图形窗口•图形窗口:画图的地方win=graphics.GraphWin()win=GraphWin()•用from语句引入图形库时可写成后者#fromTkinterimport*–创建GraphWin类的对象,并赋值给变量win.•试一试:type(GraphWin)和type(win)分别是什么?–通过给对象win发消息,让对象做事情.例如:win.close()•窗口是由像素组成的:默认大小200*200•画图:实际就是控制各像素的颜色.13help(graphics.GraphWin())help(graphics.GraphWin())HelponinstanceofGraphWininmodulegraphics:classGraphWin(Tkinter.Canvas)|AGraphWinisatoplevelwindowfordisplayinggraphics.||Methodresolutionorder:|GraphWin|Tkinter.Canvas|Tkinter.Widget|Tkinter.BaseWidget|Tkinter.Misc|Tkinter.Pack|Tkinter.Place|Tkinter.Grid|Tkinter.XView|Tkinter.YView||Methodsdefinedhere:||__init__(self,title='GraphicsWindow',width=200,height=200,autoflush=True)简单的图形编程•使用各种库中函数时,必须导入库;•Graphics是图形库,使用如下命令:importgraphics•图形窗口是屏幕上的一个区域,图形出现在该窗口内win=graphics.GraphWin()•产生的窗口标题:“GraphicsWindow.”简单的图形编程简单的图形编程•graphics.GraphWin()这样的写法显得比较麻烦,是否可以更省去呢?•fromgraphicsimport*“from”命令允许你导入一个指定的库函数,这里的“*”导入此库内的所有函数。fromgraphicsimport*win=GraphWin()•图形库有一些预定义的例程,绘制几何形状。点•点:图形窗口的一个像素,位置用坐标(x,y)表示.•坐标系统–原点(0,0):左上角–x轴:自左向右–y轴:自顶向下•小测试:默认大小的图形窗口,右下角坐标是?18(0,0)yx点(续)•创建Point类的对象Point(x坐标,y坐标)–例:p=Point(50,60)•对Point对象的操作p.getX(),p.getY()p.draw(win),p.undraw()p.move(dx,dy)p.setFill(c),p.setOutline(c)p.clone()19点的例子p=Point(50,60)p.getX()50p.getY()60win=GraphWin()p.draw(win)p2=Point(140,100)p2.draw(win)线段•创建Line类的对象Line(端点1,端点2)–例如line=Line(Point(0,0),Point(100,100))•对Line对象的操作line.draw(win),line.undraw()(去线)line.move(dx,dy)line.setFill(c),line.setOutline(c)line.setArrow(arrow)line.clone()21圆形•创建Circle类的对象Circle(圆心,半径)–例如c=Circle(Point(50,50),40)•对Circle对象的操作c.draw(win),c.undraw()c.setFill(color),c.setOutline(color)c.move(dx,dy)c.getRadius()c.clone()22椭圆•创建Oval类的对象Oval(限定框左上角,限定框右下角)–例如o=Oval(Point(20,150),Point(180,199))•对Oval对象的操作o.draw(win),o.undraw()o.setFill(color),o.setOutline(color)o.move(dx,dy)o.clone()23矩形•创建Rectangle类的对象Rectangle(左上角,右下角)–例如r=Rectangle(Point(5,8),Point(30,40))•对Rectangle对象的操作r.draw(win),r.undraw()r.setFill(color),r.setOutline(color)r.move(dx,dy)r.getP1(),r.getP2(),r.getCenter()r.clone()24多边形•创建Polygon类的对象Polygon(顶点1,顶点2,顶点3,…)•例如p=Polygon(Point(10,10),Point(30,30),Point(10,30))•对Polygon对象的操作p.draw(win),p.undraw()p.setFill(color),p.setOutline(color)p.move(dx,dy)p.getPoints()p.clone()25文本•创建Text类的对象t=Text(中心位置点,字符串)•例如t=Text(Point(99,99),”texthere”)•对Text对象的操作t.draw(win),t.undraw()t.setText(txt),t.setTextColor(c)t.getText()t.clone()26综合图形###Openagraphicswindowwin=GraphWin('Shapes')###Drawaredcirclecenteredatpoint(100,100)withradius30center=Point(100,100)circ=Circle(center,30)circ.setFill('red')circ.draw(win)###Putatextuallabelinthecenterofthecirclelabel=Text(center,RedCircle)label.draw(win)###DrawasquareusingaRectangleobjectrect=Rectangle(Point(30,30),Point(70,70))rect.draw(win)###DrawalinesegmentusingaLineobjectline=Line(Point(20,30),Point(180,165))line.draw(win)###DrawanovalusingtheOvalobjectoval=Oval(Point(20,150),Point(180,199))oval.draw(win)如何复制对象:画两眼•错误代码leftEye=Circle(Point(80,50),5)leftEye.setFill(‘yellow’)leftEye.setOutline(‘red’)rightEye=leftEye#Python变量是引用,而不是值的复制!rightEye.move(20,0)•正确代码leftEye=Circle(Point(80,50),5)leftEye.setFill(‘yellow’)leftEye.setOutline(‘red’)rightEye=Circle(Point(100,50),5)rightEye.setFill(‘yellow’)rightEye.setOutline(‘red’)28leftEyerightEyeleftEyerightEye如何复制对象:画