给普通人的Python——第四章

4. 写点有趣的程序:图形编程

写这个系列的时候我就立了一个flag,要有趣!结果前面几天讲了很多基础知识,大家越看越乏味了,这也是没办法的,没有一点点基础知识,有趣的咱也玩不转不是。我知道很多人学编程都想写那种有界面可以鼠标点按的程序,但是我们离这个目标还稍微有一点点距离,今天我们学的这一篇就是打个前站,了解一点图形化程序开发的知识。

4.1 画图基础

我们先运行下面的代码看一下效果

import turtle

window = turtle.Screen()
tt = turtle.Turtle()
tt.penup()
tt.goto(-100, 0)
tt.pendown()
tt.pencolor("red")

for i in range(4):
    tt.forward(200)
    tt.right(144)
tt.forward(200)

window.mainloop()

运行示意图

没错,我们用Python代码画了一个五角星,这就是我们今天要学习的内容,使用Python画图。

为了适应不同基础的朋友,在正式学习代码之前,咱们得先复习一下英语

单词释义
turtle海龟
screen屏幕
forward向前
backward向后
fill填充
circle圆圈

第1行代码import turtle,说明咱们画图需要先引入一个叫做“海龟”的模块。这个名字有一点莫名其妙,那么有人肯定要问了,为什么叫海龟呢?这是因为turtle绘图原理是这样的,假设有一只海龟,它正在窗口正中心,当它在画布上游动,所走过的轨迹就形成了绘制的图形。说白了,这就是turtle库作者的一个比喻,什么海龟不海龟的,其实就是指的画笔。我们所谓的画画,不就是拿笔在纸上面画线条么。

到这里我们先回忆一下生活中画画的场景,首先要支起一个画板,然后在画板上面铺上画布,最后拿起画笔沾颜料画画。我们用代码画图的时候,大致也是这么个过程,只要联系一下生活中的画画场景,就很容易理解代码。

让我们来一点点学习,首先运行下面的代码,会发现有一个窗口一闪而过

import turtle

# 创建一个窗口对象,并赋值给变量window
window = turtle.Screen()

# 创建一个海龟对象,并赋值给变量tt
tt = turtle.Turtle()

窗口一闪而过肯定是不行的,这时候我们需要在代码文件最后加一句window.mainloop(),实际上就是调用窗口对象的mainloop()函数,作用就是不让窗口立刻关闭。

再次运行下面的代码

import turtle

# 创建一个窗口对象,并赋值给变量window
window = turtle.Screen()

# 创建一个海龟对象,并赋值给变量tt
tt = turtle.Turtle()

# 不让窗口立刻退出
window.mainloop()

这里我们通过window = turtle.Screen()创建一个窗口对象,我们既然是图形程序,那肯定是需要有一个窗口的嘛。这里唯有一点要说明,这次我们调用turtle模块的Screen()函数是大写开头的,以后都要注意,创建对象的时候调用的是构造函数,函数名的首字母都是大写开头的,至于什么是对象,什么又是构造函数以后都会说明的,现在无需纠结啦,记得这回事就好。

接下来我们又通过Turtle()函数创建了一个“海龟对象”,并赋值给tt变量,我们看到窗口中有一个黑色的小三角箭头,这个就是我们的“海龟对象”,注意了,它是有朝向的哦,它默认朝向右侧。

好了,我们创建的窗口就是绘画中的画板了,它不仅是画板,而且还自带了画布呢,因此我们还省下了创建画布的过程,接着创建的“海龟”先生也就是我们的画笔了,更形象的说应该是“笔头”。到这里,万事具备只欠东风了,我们可以开始作画了!

学美术,画画之前要先学画线条,那我们就先画一条直线

import turtle

# 创建一个窗口对象,并赋值给变量window
window = turtle.Screen()

# 创建一个海龟对象,并赋值给变量tt
tt = turtle.Turtle()

# 调用海龟对象的forward函数,向前移动200像素
tt.forward(200)

# 不让窗口立刻退出
window.mainloop()

这里简单说一下像素这个单位,我们通常说的屏幕的分辨率就是其实就是指的像素,比如我们说的屏幕的分辨率1920x1080,其实就是指该屏幕宽有1920个像素,高有1080个像素。

这次让我稍微画复杂一点的,画一个直角

import turtle

# 创建一个窗口对象,并赋值给变量window
window = turtle.Screen()

# 创建一个海龟对象,并赋值给变量tt
tt = turtle.Turtle()

# 调用海龟的forward函数,向前移动200像素
tt.forward(200)

# 抬起画笔
tt.penup()

# 调用backward函数,向后退200像素
tt.backward(200)

# 落下画笔
tt.pendown()

# 向左转90度
tt.left(90)

# 向前移动200像素
tt.forward(200)

# 不让窗口立刻退出
window.mainloop()

上面代码的注释已经写得很详细了,penuppendown这些函数名也都很好认,只有一点要说明,那就是只有当我们的画笔是落下状态时,向前或向后移动才能画出线条,而当我们调用penup()函数抬起画笔后,前后移动是不会画出线条的,而画笔默认就是落下的。

理解了之后,上面的都是小儿科了,下面我们接着学习,在之前的代码后面增加几行代码,我们再画一个圆

import turtle

# 创建一个窗口对象,并赋值给变量window
window = turtle.Screen()

# 创建一个海龟对象,并赋值给变量tt
tt = turtle.Turtle()

# 调用海龟的forward函数,向前移动200像素
tt.forward(200)

# 抬起画笔
tt.penup()

# 调用backward函数,向后退200像素
tt.backward(200)

# 落下画笔
tt.pendown()

# 向左转90度
tt.left(90)

# 向前移动200像素
tt.forward(200)

# 将画笔复位到初始状态,也就是窗口正中心位置
tt.home()

# 设置画笔的粗细
tt.pensize(10)

# 设置画笔的颜色
tt.pencolor("yellow")

# 画圆弧,第一个参数为半径,第二个参数为弧度。360为整圆,180为半圆
tt.circle(100, 360)

# 不让窗口立刻退出
window.mainloop()

这里就不放图了,大家运行之后看效果

最后,我们来说一下关于坐标体系的问题。我们初中数学就已经学过平面直角坐标系,这个相信大家都不陌生,在我们的turtle中,画笔默认出现的位置就是我们的坐标原点(0,0),也就是我们窗口的正中心,我们调用tt.home()其实就是让画笔回到坐标原点复位,且画笔的朝向也复位为朝右。这一点我们可以调用函数来验证

import turtle

# 创建一个窗口对象,并赋值给变量window
window = turtle.Screen()

# 创建一个海龟对象,并赋值给变量tt
tt = turtle.Turtle()

# 调用pos函数,返回画笔当前的坐标点并打印输出
print(tt.pos())

# 不让窗口立刻退出
window.mainloop()

输出结果:

(0.00, 0.00)

如上,我们调用画笔的pos()函数返回当前坐标点,这里pos就是position的缩写。可以看到,默认位置坐标正是原点。既然如此,那么我们想将画笔移动到任意坐标位置怎么办呢?这个时候,我们可以通过调用画笔的goto()函数做到,该函数可以传入两个参数,这是x、y的坐标值。这个函数在我们一开始绘制五角星的代码中使用过tt.goto(-100, 0),这里要记得,如果我们只是想移动到指定的坐标位置,而不想画出线条,那么我们应该先调用penup()函数抬起画笔,当我们要画线时,则需要再调用pendown()落下画笔。

4.2 深入用法

这次我们写一个稍微深入一点的示例,画一个圆并给圆中填充绿色,除了画图,我们还学习一下文字的写法

import turtle

# 创建一个窗口对象,并赋值给变量window
window = turtle.Screen()

# 创建一个海龟对象,并赋值给变量tt
tt = turtle.Turtle()

# 隐藏画笔的小箭头
tt.hideturtle()

# 写一行文字,并设置字体和字号
tt.write("人生苦短,我用Python", font=("华文行楷", 18))

# 抬起画笔
tt.penup()

# 移动画笔到(0,100)坐标处
tt.goto(0, 100)

# 放下画笔
tt.pendown()

# 设置填充色
tt.fillcolor("green")

# 开始填充
tt.begin_fill()

# 画一个圆
tt.circle(100, 360)

# 完成填充
tt.end_fill()

# 不让窗口立刻退出
window.mainloop()

4.3 使用总结

这里将上面代码中调用过的函数做一个总结,方便查看

函数说明
home()将画笔移动到起点(0,0),并朝向右侧
forward(distance)将画笔向前方移动distance个像素
backward(distance)将画笔向后方移动distance个像素
right(degree)将画笔向右旋转degree度
left(degree)将画笔向左旋转degree度
penup()抬起画笔
pendown()落下画笔
circle(r, extent)绘制一个指定半径、弧度的圆
pencolor(color)设置画笔颜色
pensize(width)设置画笔宽度
fillcolor(color)设置填充颜色
begin_fill()准备开始填充图形
end_fill()填充完成
hideturtle()隐藏画笔的turtle的形状
showturtle()显示画笔的turtle的形状
write(s)写文本,s为文本内容
goto(x,y)让画笔移动到指定位置
pos()返回当前画笔的坐标

剩下的的,就靠大家发挥创意,看怎么画出好玩的图像来,这里附两张网友作品给大家欣赏一下
在这里插入图片描述
在这里插入图片描述
附录:常用颜色
这里提供几种常见色值名,大家可以都试一试

色值名颜色
white白色
yellow黄色
blue蓝色
black黑色
green绿色
purple紫色
pink粉红色
gray灰色
gold金色
cyan青色
tomato番茄色

请关注公众号:编程之路从0到1

只要关注,即可获取网盘资源!
配合本教程,还有视频讲解哦,不容错过
在这里插入图片描述

血色v残阳 CSDN认证博客专家 编程达人 Flutter 课程讲师
掌握C、Java、Python、Go、Dart语言等多种编程语言,擅长GUI开发,曾从事Android原生开发,Flutter跨平台开发等等工作
微信公众号:
“编程之路从0到1”
相关推荐
<p> 需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》, </p> <p> 课程链接 https://edu.csdn.net/course/detail/29865 </p> <h3> <span style="color:#3598db;">【为什么要学习这门课】</span> </h3> <p> <span>Linux</span>创始人<span>Linus Torvalds</span>有一句名言:<span>Talk is cheap. Show me the code. </span><strong><span style="color:#ba372a;">冗谈不够,放码过来!</span></strong> </p> <p> <span> </span>代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。 </p> <p> YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。 </p> <p> YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。 </p> <h3> <span style="color:#3598db;">【课程内容与收获】</span> </h3> <p> 本课程将解析YOLOv4的实现原理和源码,具体内容包括: </p> <p> - YOLOv4目标检测原理<br /> - 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算<br /> - 代码阅读工具及方法<br /> - 深度学习计算的利器:BLAS和GEMM<br /> - GPU的CUDA编程方法及在darknet的应用<br /> - YOLOv4的程序流程 </p> <p> - YOLOv4各层及关键技术的源码解析 </p> <p> 本课程将提供注释后的darknet的源码程序文件。 </p> <h3> <strong><span style="color:#3598db;">【相关课程】</span></strong> </h3> <p> 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括: </p> <p> 《YOLOv4目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4-tiny目标检测实战:训练自己的数据集》 </p> <p> 《YOLOv4目标检测实战:人脸口罩佩戴检测》<br /> 《YOLOv4目标检测实战:中国交通标志识别》 </p> <p> 建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。 </p> <h3> <span style="color:#3598db;">【YOLOv4网络模型架构图】</span> </h3> <p> 下图由白勇老师绘制 </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006291526195469.jpg" /> </p> <p>   </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202007011518185782.jpg" /> </p>
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页