您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > Python > Python-教程-chapter5
面向对象与图形编程22数据与操作:传统观点数据类型–某种值的集合–运算(操作)的集合计算就是对数据进行操作–数据与操作分离–数据是被动的,操作是主动的例如:string类型的值是’abc’等,对串的操作有+,*,len()等3数据与操作:面向对象观点对象(Object):集数据与操作于一身–对象知道一些信息–对象能对那些信息进行处理计算:向对象发出请求操作的消息.–主动的数据类型举例–自动门–文件4数据与操作:面向对象观点面向对象(Object-Oriented)基本思想:软件系统由各种对象组成,对象之间通过消息进行交互现代软件系统几乎都是OO设计和实现学习面向对象的思想和方法OO语言–C++(过程性语言C发展而来)–VisualBasic(过程性语言Basic发展而来)–Java–Python–…55OO基本概念类(class):描述同类对象的共性–包含的数据任何类型的数据,甚至可以是对其他对象的引用.–能执行的操作(方法)对象(object):类的实例(instance)–类可以创建多个实例–同类的不同对象可有不同的数据值(实例变量),但能执行的操作是一样的例如:类:file对象:infileName,outfileName666OO基本概念创建对象:使用类的构造器(constructor)(构造函数)–类名(参量1,参量2,…)–例如:file(filename[,mode[,bufsize]])open(filename,mode)消息:请求对象执行它的方法–对象.方法名(参量1,参量2,…)–例如:infileName.close()对象的方法不同类的对象当然提供不同的操作对象一般都提供读取它的实例变量值的方法,统称为accessor.–Point对象的getX()和getY()–Line对象的getP1()和getP2()对象一般也提供修改其实例变量的方法,统称为mutator.例:所有图形对象都有move(dx,dy)方法.将对象在x方向移动dx个像素,在y方向移动dy个像素,自动擦除其原来的图像,并在新位置处显示7图形编程图形用户界面(GUI,GraphicalUserInterface)–例如:窗口、按钮、菜单、图标等–简化使用,扩大了应用范围–与command比,不用记命令8图形编程图形编程框架–Python的Tkinter(自学)–本书作者写的图形库:graphics.py(便于初学者使用)放入合适文件夹python\lib\importgraphics或fromgraphicsimport*–后者可使引用库函数更方便开始编写图形程序9图形窗口图形窗口:画图的地方win=graphics.GraphWin()win=GraphWin()#用from语句引入图形库时可写成这样–创建GraphWin类的对象,并赋值给实例变量win试试:type(GraphWin)和type(win)、type(GraphWin())分别是什么–通过给对象win发消息,让对象做事情例如:win.close()10图形窗口窗口是由像素组成的默认大小200*200(分辨率)画图:实际就是控制各像素的颜色11点点:图形窗口的一个像素,位置用坐标(x,y)表示坐标系统–原点(0,0):左上角–x轴:自左向右–y轴:自顶向下小测试:默认大小的图形窗口,右下角坐标是?12(0,0)xy点(续)创建Point类的对象Point(x坐标,y坐标)–例:p=Point(50,60)(Point构造器创建实例,赋给一个变量p)13Pointp:5060x:y:点(续)对Point对象的操作–求坐标(accessor)p.getX(),p.getY()–在窗口win中画自己p.draw(win)14线段创建Line类的对象Line(端点1,端点2)–例如l=Line(Point(0,0),Point(100,100))对Line对象的操作–在窗口中画自己l.draw(win)15圆形创建Circle类的对象Circle(圆心,半径)–例如c=Circle(Point(50,50),40)对Circle对象的操作–填充颜色c.setFill(‘red’)–在窗口中画自己c.draw(win)16画圆Point5050x:y:Circlecirc:40center:radius:GrapWinwin:...draw()…Low-leveldrawingcommandsOO编程的能力所在编程者–创建对象–调用合适的方法–让它们为你工作起来–仅此而已椭圆创建Oval类的对象Oval(限定框左上角,限定框右下角)–例如o=Oval(Point(20,150),Point(180,199))对Oval对象的操作–在窗口中画自己o.draw(win)19矩形创建Rectangle类的对象Rectangle(左上角,右下角)–例如r=Rectangle(Point(5,8),Point(30,40))对Rectangle对象的操作–在窗口中画自己r.draw(win)20多边形创建Polygon类的对象Polygon(顶点1,顶点2,顶点3,…)例如p=Polygon(Point(10,10),Point(30,30),Point(10,30))对Polygon对象的操作–在窗口中画自己p.draw(win)21文本创建Text类的对象t=Text(中心位置点,字符串)例如t=Text(Point(99,99),”texthere”)对Text对象的操作–在窗口中画自己t.draw(win)–重设字符串t.setText(“newtext”)22对象与其实例变量—引用Pointp:5060x:y:p=Point(50,60)p2=p#aliasingp2.move(10,0)p2.getX()#60p.getX()#60p2:60如何复制对象:画两眼错误代码leftEye=Circle(Point(80,50),5)leftEye.setFill(‘yellow’)leftEye.setOutline(‘red’)rightEye=leftEye#对象变量是引用,而不是值的复制!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’)24如何复制对象:画两眼(续)更美观的代码leftEye=Circle(Point(80,50),5)leftEye.setFill(‘yellow’)leftEye.setOutline(‘red’)rightEye=leftEye.clone()#使用clone()复制对象rightEye.move(20,0)25VPython自学VPython(3D)fromvisualimport*编程实例:投资收益图形版用柱状图表示10年的投资收益算法–输入本金和年利率–创建图形窗口–窗口左边画上刻度–0号位置画对应初始本金的柱子–对接下来的1到10年:principal=principal*(1+apr)在相应位置画对应本利的柱子27编程实例:投资收益图形版(续)创建图形窗口确定图形窗口的尺寸算法精化创建320x240的图形窗口,标题为‘‘InvestmentGrowthChart’’–小知识:为什么选320x240?(可移植性好)Python代码win=GraphWin(InvestmentGrowthChart,320,240)28编程实例:投资收益图形版(续)窗口左边画上刻度确定刻度的内容和位置–内容:0.0K,2.5K,5.0K,7.5K,10.0K右对齐,左边填充空格–位置:确定水平方向20像素为中心;垂直方向5个刻度($10,000)平分200像素做点实验,找个美观的位置算法精化Drawlabel0.0Kat(20,230)Drawlabel2.5Kat(20,180)Drawlabel5.0Kat(20,130)Drawlabel7.5Kat(20,80)Drawlabel10.0Kat(20,30)29编程实例:投资收益图形版(续)0号位置画对应初始本金的柱子确定0号柱子的位置和高度–位置:左下角坐标为(40,230).Why?–高度:230principal*(200/10000).即右上角y坐标.–宽度:(32040)/1125,故右上角x坐标为40+25=65算法精化0号柱:从(40,230)到(65,230-principal*0.02)画矩形30编程实例:投资收益图形版(续)接下来的1到10年其他柱子的位置和高度–位置:左下角为(year*25+40,230).–高度:principal*(200/10000),则右上角y坐标为230principal*(200/10000).–宽度:25,故右上角x坐标为(左下角x坐标+25)算法精化foryear从1到10:principal=principal*(1+apr)xll=25*year+40height=principal*0.02从(xll,230)到(xll+25,230-height)画矩形31自定义坐标系默认坐标系以像素为单位–编程很麻烦–依赖于窗口像素尺寸坐标变换:实际数据需映射成窗口像素位置–Graphics模块提供自定义坐标系的功能,使坐标变换自动完成32自定义坐标系好处–编程简单直观–改变窗口像素尺寸对程序几乎没影响33例子:坐标系变换例如win=GraphWin(“Tic-Tac-Toe”)win.setCoords(0.0,0.0,3.0,3.0)Line(Point(1,0),Point(1,3)).draw(win)Line(Point(2,0),Point(2,3)).draw(win)Line(Point(0,1),Point(3,1)).draw(win)Line(Point(0,2),Point(3,2)).draw(win)–新坐标系为:左下角(0,0),右上角(3,3)–系统自动把新坐标变换成200*200像素坐标–适用于窗口大小改变编程实例:futval2.py34图形交互界面GUI–图形元素用于输入输出–事件驱动的编程系统初始化后等待用户指令或者等待事件的发生事件:移动鼠标,点击按钮,选菜单等–也是对象,包含数据–事件发生后,有相应事件处理程序来处理35捕获鼠标点击GraphWin类有一个方法getMouse():调用时等待用户点击,并返回点击位置(是个Point对象).例如:win=GraphWin(ClickMe!)foriinrange(10):p=win.getMouse()printYouclicked(%d,%d)%(p.getX(),p.getY())36编程实例:triangle.pyw#Program:triangle.pywfromgraphicsimport*defmain():win=GraphWin(DrawaTriangle)win.setCoords(0.0,0.0,10.0,10.0)message=Text(Point(5,0.5),Clickonthreepoints)message.draw(win)p1=win.getMouse()p1.draw(win)p2=win.getMouse()p2.draw(win)p3=win.getMouse()p3.dr
本文标题:Python-教程-chapter5
链接地址:https://www.777doc.com/doc-3942968 .html