趣学Python—教孩子学编程序(PYTHON FOR KIDS)
2018-11-25
海龟画图的问题是太满了。计算机绘图,尤其是游戏里,通常都要求能快速移动
除了Turtle模块外,Python提供了多种制图的方法。Python标准安装程序中自带了tkinter模块,可以用来创建完整的应用程序,比如简单的字处理软件,还有简单的绘图软件
12.1 创造一个可以点的按钮
作为例子,我们创建一个简单的按钮
from tkinter import *,可以在不用模块名子的情况下使用模块的内容了。还记得之前的import turtle/t=turtle.Pen()吗?和这种方式相比,对有很多类和函数的模块来说,这样可以少敲几下键盘
为了让点击“click me”有动作,先创建一个函数来打印一些文字
修改上面的例子来使用这个新函数
12.2 使用具名参数
具名参数和普通参数一样,只是它不按函数所提供的参数的顺序来决定哪一个参数获得哪一个数值,我们明确地定义值的名字,所以可以写成任何顺序。有时,函数有很多参数,我们不是总要给每个参数都赋值,具名参数可以让我们只为我们想要给它赋值的参数提供值
12.3 创建一个画图用的画布
如果要画图,我们需要一个canvas(画布)对象,也就是Canvas类的对象(由tkinter模块提供)
当我们创建一个画布时,我们给Python传入画布的宽度和高度(以像素为单位)
和按钮的例子相同,输入tk=Tk()时,会出现一个窗口,最后一行用canvas.pack()把画布布置好。pack函数让画布显示在窗口中正确的位置上,如果没调用这个函数,就不会正常的显示任何东西
12.4 画线
要在画布上画线,就要用像素坐标。坐标,定义了一个平面上像素的位置。在一个tkinter画布上,坐标决定了像素横向(从左到右)的距离,以及纵向(从上到下)的距离
create_line函数返回1,它是个标志。如果用turtle模块完成同样的事,代码要更多一些
12.5 画盒子
用turtle画盒子,需要向前,转弯,再向前,再转弯等等,来画一个正方形或长方形。而tkinter模块就简单多了,你只要知道各个角的坐标
create_rectangle(10,10,50,50)中,参数是正方形左上角和右下角的坐标,这些坐标是参照画布左边和顶边的距离。左上角距左边10像素,距顶边10像素。右下角距左边50像素,距顶边50像素。现在我们改变坐标,再画一个矩形
12.5.1 画许多矩形
我们可以用很多大小各异的矩形来填满画布。我们可以引入random随机数模块,然后写一个函数用随机数做矩形左上角和右下角的坐标
把画步的宽度和高度作为参数,试验一下这个函数。random_rectangle(400,400)
然后用一个for循环来画100个随机长方形,加上下面这些代码,保存,然后运行一下
12.5.2 设置颜色
现在我们来修改random_rectangle函数,传入一个额外的参数(fill_color)来指定矩形的颜色
然后我们来运行这个函数random_rectangle(400,400,"green")。如果要定制一个和有命名的颜色不完全一样的颜色怎么办?可以这样
ffd800之前的#告诉Python我们提供的是一个”十六进制“数字。你可以用字符串中的的占位符%x把一个普通的数字转换成十六进制数,例如
如果要确保得到的数字至少有两位,可以稍微改动一下格式占位符
tkinter模块提供了一个简单的方法来得到十六进制颜色值(注:我执行时出错了)
运行这段代码会显示一个颜色选择器,选择一个颜色并按“确定”,会出现一个元组,比如((235.91796875,86.3359375,153.59765625),"#eb5699"),在tkinter中,每个主色的量分别由一个0~255之间的数字表示(turtle中是一个百分比)。后面的是这三个数字的十六进制版本。可以这样来使用
12.6 画圆弧
圆弧是圆周的一段,或者说是一种曲线。为了在tkinter中画出一个圆弧,你需要用create_arc函数在一个矩形中作图
canvas.create_arc把包含着圆弧的矩形的左上角坐标设置为(10,10),右下角坐标是(200,100)。extend用来指定圆弧的角度。我们来试试不同的角度
12.7 画多边形
多边形就一个有三个或三个以上边的形状。用tkinter画多边形时,需要为多边形的每个点提供坐标。下面这个三角形从坐标(10,10)开始,画到(100,10),然后结束于(100,110)
我们再来画一个不规则的多边形,坐标从(200,10)开始,到(240,30),再到(120,100),结束于(140,120),tkinter会自动画连线到第一个开始的坐标
12.8 显示文字
可以用create_text在画布上写字。参数text是要显示的文字,参数fill是文字的颜色,参数font可用一个元组来指定文字的字体名和大小
12.9 显示图片
要用tkinter在画布上显示图片,首先要装入图片,然后用canvas对象的create_image函数
tkinter只能装入GIF图片,如果要显示其他类型的图片,如PNG和JPG,你需要用到其他模块,比如Python图像库(http://www.pythonware.com/products/pil/)
我们用路径c:\\test.gif来建立一个PhotoImage,把图片装入到变量my_image中,然后用create_image函数来显示它。坐标(0,0)是要显示图片的位置,anchor=NW让函数使用左上角(NW是northwest,西北向)作为画图的起始点(否则它默认用图片的中心作为起始点)
12.10 创建基本的动画
动画不是tkinter的特长,但基本的处理还是可以做的。比如我们创建一个填色的三角形,让它在屏幕上横向移动
tk.update()强制tkinter更新屏幕(重画),如果我们没用update的话,tkinter会等到循环结束时才会移动三角形,这样的话你只会看到它跳到最后的位置,而不是平滑地穿过画布。我们再来让三角形沿着对角线进行移动
12.11 让对象对操作有反应
我们可以用“消息绑定”来让三角形在有人按下某键时有反应。“消息”是在程序运行中发生的事件,比如有人移动了鼠标、按下了某键,或关闭了窗口等。你可以让tkinter监视这些事件,然后做出反应
要开始处理事件(让Python在事件发生时做些事情),我们首先要创建一个函数。当我们告诉tkinter将某个特定函数绑定(或者说关联)到某个特定事件上就完成了绑定。换句话说,tkinter会自动调用这个函数来处理事件。例如,要让三角形在按下回车键时移动,我们可以定义这个函数
这个函数只接收一个参数event,tkinter用它来给函数传递关于事件的信息。然后我们用画布canvas上的bind_all函数来告诉tkinter当特定事件发生时应该调用这个函数。该函数的第一个参数说明我们让tkinter监视什么事件(在这里,监视的事件叫,也就是按下回车键),我们告诉tkinter当这个KeyPress事件发生时应该调用movetriangle函数
那个根据按键不同改变三角形方向怎么样?很容易,我们修改movetringle函数。传入movetringle的event对象包含了几个变量,其中一个叫keysym(key symbol,键的符号),它是一个字符串,包含了实际按键的值。记住,canvas.move的第一个参数是画布上所画的形状的ID数字,第二个是对x坐标增加的值,第三个是对y坐标增加的值。好了,我们看看完整的程序
12.12 更多使用ID的方法
只要用了画布上面以create_开头的函数,例如create_polygon或者create_rectangle等,它总会返回一个ID。这个识别编号可以在其他的画布函数中使用,就像早前我们使用的move函数一样。但是,create_开头的函数不会总是返回1,例如,如果你之前创建了其他的形状,它可能会返回2、3,甚至100(要看之前创建了多少形状)。如果我们修改代码来把返回值作为一个变量保存,然后使用这个变量(而不是直接使用数字1),那么无论返回值是多少,这段代码都能工作
move函数让我们可以通过ID让对象在屏幕上移动,但是还有其他画布上的函数也能改变我们已经画好的东西。例如,画布上的itemconfig函数可以用来改变形状的某些参数,比如说它的填色以及轮廓线的颜色。假设我们先创建了一个红色的三角形
然后我们用itemconfig来改变三角形的颜色
也可以给三角形加一条不同颜色的轮廓线
以后,我们还要学习如何给图案做出其他改变,比如说隐藏和重现。当我们在下一章开始写计算机游戏时,你会发现能够修改已经在屏幕上的画好的东西很有用
12.13 你学到了什么
用tkinter模块在画布上画出了简单的几何形状
显示图片
做简单的动画
用事件绑定让图形响应按键,这在我们写计算机游戏时很有用
tkinter中以create_开头的函数是如何返回一个ID数字,并可以在形状画好以后利用它来做修改,比方说在屏幕上移动或修改颜色
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。
http://www.pinlue.com/style/images/nopic.gif