Python模块 turtle的一个简单实例----爱心发射
本质上是对今天学习绘图的记录,个人记录,个人记录。
简单介绍turtle以及准备工作
官方的就很好啦
涉及到的软件:pycharm、git、zsh。
绘图思想
实际上了解turtle绘图的机制之后,绘制图形就是一件很简单的事情了。就像是你拿着画笔在选点绘线一样,只要注意好坐标位置。
在我的实际操作中,发现一个比较有趣的地方就是对心型的绘制。事实上我一开始以为是要把笛卡尔心型线给封装进去,搜索后发现大家很多都是用控制偏移来画出心形,然后就看到一些比较有意思的画法了。
一看就是工科生画法hh 机械制图还是有好处qwq
具体就是把握住 circle()会在当前点左边半径距离开始画圆就ok了,美中不足就是下面该是弧度,可以拿cad对应尺寸算一下改改
最终结果
其实是用视频转出来的,鬼知道我换了几个剪辑软件@-@
几个软件推荐一下Kdenlive,我愿称你为小pr
pacman直接就能下载
遇到并解决的问题
作为arch新手,连夜组好的python环境还很脆弱QAQ 在绘图之前的工作和绘图之后的报错、导出都是坑。来来回回花费了将近半天时间才算是勉强完成。下面是可能出现的问题以及解决方法
- 记录图像的时候调用的tkinter模块,会报出
No module named _tkinter
的错误信息。问题原因可能有很多,文末链接一个或许有帮助的帖子。事实上上述所有的情况我都试了,还是一直报错,就在我快要绝望的时候,我才想起来,python3里tkiter是小写开头,我导入的时候忘记改了...遂解决 - 关于pip list里面已经安装好的库,pycharm不识别的情况。这一点其实很重要,涉及到python虚拟环境的情况。事实上你开创一个新项目,pycharm会给你提供一个新的独立环境来为改项目服务,就会产生两个包环境,从离他近的那个读取包列表。具体解决方法文末链接,个人认为很透彻了,这才是一个正经回答该有的样子。
仍存在的问题,提供折中方法
-
针对arch linux :使用oh-my-zsh来配置zsh, 会和anaconda冲突。造成主题缺失、部分命令不可用的问题。这一点困扰了我好久,网上也没有什么特别有帮助的信息。只能说自己对linux还是不够了解,抽空挤时间好好研究一下。
在此diss一下中文社区的环境,一个答案各个平台甚至是同平台你抄来我抄去,图都不带换样的,还没啥实质性帮助。为了那么点流量至于吗,每次都得贼慢的去stack上面看鸟国人交流。
我临时的方法是使用pycharm, 暂时放弃jupyter notebook(能用,但是终端太丑了我受不了嘤嘤嘤)
-
记录turtle的绘图记录:这个也是个难缠的问题,或许windows会很好解决。
1、事实上stackoverflow上面有很完美的解决方法,遗憾的是他生成的是.eps文件而非gif。需要通过专业软件PS、IL等再去处理。(醒醒,你是linux用户)或许你可以通过网页上的在线转换转来一张张gif文件,然后批量合成这些gif文件成一个gif。oh, it's terrible.
2、github上有个开源项目,专门写了一个包来记录并生成gif和视频。你可以通过git clone的方式获取,注意原文指导有一点歧义,执行install文件需要在你的.git那里而非根目录,同时需要sudo提限如果不是特意设置的话。
参考文章
注意你的python版本,或许会存在问题
事实上他不该是个问题,你需要了解你的工具。对于新手来说这是一篇非常好的文章。
3、save turtle's drawing as an animated GF
很完美的解决方法,但是需要额外软件支持
主要是想法nice, 简单实惠。
我的源码
事实上生成gif的方法并不完善,我只放出来了绘图部分的代码,仅供参考
# Have a nice day!
# A pink heart for you.
import tkinter
import turtle as tl
def draw():
tl.color('black')
tl.pensize(2)
# head
tl.penup()
tl.setpos(-200, 0)
tl.pendown()
tl.circle(50)
# body
tl.right(90)
tl.forward(70)
# leg_left
tl.right(45)
tl.forward(70)
# leg_right
tl.penup()
tl.setpos(-200, -70)
tl.pendown()
tl.left(120)
tl.forward(50)
tl.right(110)
tl.forward(60)
# arm_left
tl.penup()
tl.setpos(-200, -25)
tl.pendown()
tl.setheading(270)
tl.left(90)
tl.forward(40)
tl.left(50)
tl.forward(40)
# arm_right
tl.penup()
tl.setpos(-200, -45)
tl.pendown()
tl.setheading(270)
tl.left(90)
tl.forward(40)
tl.right(50)
tl.forward(40)
# heart
tl.fillcolor("pink")
tl.begin_fill()
tl.pensize(2)
tl.pencolor("pink")
tl.penup()
tl.setpos(-70, -80)
tl.pendown()
tl.setheading(0)
tl.left(45)
tl.fd(60)
tl.circle(30, 180)
tl.right(90)
tl.circle(30, 180)
tl.fd(60)
tl.end_fill()
# eyes
tl.pensize(5)
tl.pencolor("black")
tl.penup()
tl.setheading(270)
tl.setpos(-220, 60)
tl.pendown()
tl.fd(10)
tl.penup()
tl.setheading(270)
tl.setpos(-180, 60)
tl.pendown()
tl.fd(10)
# done
tl.hideturtle()
draw()