十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
生成一张纯色的图片
为揭西等地区用户提供了全套网页设计制作服务,及揭西网站建设行业解决方案。主营业务为网站设计制作、成都做网站、揭西网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
先设置图片的颜色,接着利用Image模块的new方法新生成一张图片,png格式的图片需要设置成rgba,类似的还有rgb,L(灰度图等),尺寸设定为640,480,这个可以根据自己的情况设定,颜色同样如此。
批量生成图片
上面生成了一张图片,那要生成十张图片呢,这种步骤一样,只是颜色改变的,利用循环就可以解决。首先创建一个颜色列表,把要生成的图片颜色放进去。接着循环获取不同的颜色,保存的时候利用字符串拼接的方法改变图片的名字。
本地生成的图片
封装成函数
前面的方法已经可以批量生成图片了,为了通用性强一点,我们可以封装成函数,把哪些可以改变的参数单独抽离出来。尺寸也同样,使用的时候,可以根据自己的需要定义颜色列表和尺寸。当然还有加一些提示用语和报错兼容性,这里就不讲了。
本地生成的图片
要用到turtle库中的函数,
turtle库是一个绘制图像的函数库,横轴为x轴,纵轴为y轴
def 表示用户自定义函数,drawsnake为函数名,()中为函数参数
定义颜色
循环 len 次,i用来计数
pencolor() 函数,改变画笔颜色,参数为颜色
circle( , ) 函数,画圆,第一个参数为半径,正数表示在左侧,负数表示在右侧,第二个参数为圆形的弧度值。
fd()函数,画直线,参数为直线长度
fd()函数,画直线,参数为直线长度
用户自定义函数 main()
setup ( , , , ) 函数,启动图形窗口,四个参数分别是,宽度,高度,窗口左上角在屏幕中的x坐标和y坐标。
定义画笔宽度
pensize() 函数,画笔宽度,30像素
seth() 函数,画笔启动时的方向,其中参数,0表示东,顺逆时针方向度数递增。
调用drawsnake函数
调用main函数
[Turtle]库的使用
打开窗口:turtle.setup(650,350,200,200)
窗口的大小:width:650 height:350
窗口的位置:在屏幕的(200,200),默认情况下在屏幕的中心位置
画笔抬起,不留下痕迹:turtle.penup()
改变画笔的位置:turtle.fd(-250) 可用turtle.forward(-250)代替
画笔向后倒退250,默认情况下在窗口的正中心位置
画笔落下,留下痕迹:turtle.down()
改变画笔的粗细:turtle.pensize(25)
改变画笔的颜色:turtle.pencolor(“purple”)
改变画笔的前进方向:turtle.seth(-40)可用turtle.heading(-40)代替
画笔此时指向-40°的方向
循环:range(4)函数
参数是几就循环几次
for i in range(4):i的范维是[0,4)
画圆弧:turtle.circle(40,80); turtle.circle(-40,80)
40是圆弧的半径,代表以画笔所在位置的左侧距离40的地方为圆心
-40代表画笔所在位置右侧距离40的地方为圆心
80是代表弧度80的圆弧
画直线:turtle.fd(40)
画笔向前移动40
因为画笔已经落下,所以屏幕中有画笔的痕迹
画笔停止绘制,但窗口不关闭:turtle.done()
程序运行结果:
如果能够找到规律,可以让代码变得更简单。上述代码中其实就是调用circle()函数四次,每次传入参数不同而已。
我们可以加入循环,循环就是重复不停地做相同的事情;再找到循环变量和画圆参数之间的规律即可。
第一个圆的半径为50,每次按15的节奏递减,直到绘制完半径为5的圆。这样就可以使用range()函数,传入如下参数:range(50,0,-15)。
或者由小到大绘制,传入这样的参数也可以:range(5,51,15)。
还可以这样:循环四次,循环变量i依次为0、1、2、3,再在绘制圆的过程中构造递减的表达式:100/2-i*15。
分析这个表达式,当i等于0时,结果为50,绘制半径为50的圆;当i等于1时,结果为35,绘制半径为35的圆……正好符合题目要求的参数值。
【扩展】思考如何绘制以坐标原点为中心的同心圆呢?
仔细观察画笔绘制圆的轨迹,可发现:默认小海龟从坐标原点出发,逆时针旋转一圈画圆;然后,再回到起始点。
所以,绘制同心圆。我们需要将画笔向下移动一定的距离,即改变y的坐标,x坐标保持不变为0。参考代码如下:
循环体内,每次需要抬笔和落笔功能。
02
案例二:绘制一个正多边形
绘制正多边形有这样一个结论:用360°去除以绘制的边数,即可得到旋转角度。
比如:正三角形的旋转角度(360/3=120°)、正四边形的旋转角度(360/4=90°)、正八边形的旋转角度(360/8=45°)。其他以此类推。
那么,我们要绘制一个正八边形呢?
使用循环结构,循环八次。每次前移一定距离,再旋转(360/边数)的角度,这里旋转的就是45°角。参考代码如下:
有了这样的结论,其他的正多边形都可以信手拈来,小菜一碟了。只需要稍微改几个参数即可。
03
案例三:绘制由多种颜色组成的正螺旋线
比如,这样的图形:
这是由八种颜色组成的正八边形螺旋线结构图,颜色依次为:红(red)、绿(green)、蓝(blue)、黄(yellow)、紫(purple)、橙(orange)、黑(black)、粉(pink)等八种。
绘制思路:
首先,需要创建一个颜色列表list,含有八种颜色元素。
第二,前移一定距离,这个距离值是由小到大逐级递增的过程。
第三,旋转一定角度,可参照案例二的结论。
最后,考虑画笔的颜色,每8次(边数)为一个周期循环颜色列表。
参考代码如下:
其他的正螺旋线,也是如此规律。
【扩展】如果是有一定旋转角度的螺旋线呢?比如,这样的图形:
解题思路:只需要在正螺旋线的基础上,让旋转角度多偏移1-2°即可。修改上述案例中最后一行的代码:
示例代码
# 导入Tkinter模块
from tkinter import *
# 创建一个窗口
window = Tk()
# 定义一个函数,用来生成图形
def generate_shape():
# 使用随机数生成不同的图形和颜色
shape = random.choice(["circle", "square", "triangle"])
color = random.choice(["red", "green", "blue"])
# 使用随机数生成不同的位置
x = random.randint(0, 200)
y = random.randint(0, 200)
# 在窗口中绘制图形
if shape == "circle":
# 绘制圆形
canvas.create_oval(x, y, x + 50, y + 50, fill=color)
elif shape == "square":
# 绘制正方形
canvas.create_rectangle(x, y, x + 50, y + 50, fill=color)
else:
# 绘制三角形
points = [x, y, x + 50, y + 50, x + 25, y + 75]
canvas.create_polygon(points, fill=color)
# 创建一个画布
canvas = Canvas(window, width=200, height=200)
canvas.pack()
# 创建一个按钮
button = Button(window, text="Start", command=generate_shape)
button.pack()
# 进入消息循环
window.mainloop()