[Python] 震惊, 我居然用Python干这种事ꈍ .̮ ꈍ

更多示例代码下载地址 : https://github.com/Amd794/Python123
前言
- 最初来自于 Wally Feurzig 和 Seymour Papert 于 1966 年所创造的 Logo 编程语言
- 可以通过相关的指令, 轻松地绘制出精美的形状和图案
- 可以培养学习计算机的兴趣, 以一种娱乐的方式了解计算机的趣味
- Python 海龟创意绘画, Turtle库创作精美图画
- 通过阅读本文, 你可以学习到LSystem的应用和掌握绘制一些图形 , 有关介绍: https://en.wikipedia.org/wiki/L-system
turtle 基础教程
- 个人推荐看官方的文档, https://docs.python.org/zh-cn/3/library/turtle.html
部分效果预览









简单的例子应用
turtle文字的应用
一个很简单的随机文字
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
from turtle import *import randomstr_ = """守一段情 念一个人。时光不老 我们不散。厮守终生 不离不弃。天暗下来 你就是光。亡魂溺海 止于终老。生死挈阔 与子成说。柔情似水 佳期如梦。我中有你 你中有我。青山不老 为雪白头。心若向阳 无畏悲伤。一人一心 白首不离。心如荒岛 囚我终老。我的世界 只有你懂。你若安好 便是晴天。心有灵犀 一点就通。厮守海角 非你不娶。执子的手 漫漫的走。执子之手 与子偕老。山河拱手 为君一笑。红尘初妆 山河无疆。千秋功名 一世葬你。既不回头 何必不忘。既然无缘 何须誓言。今日种种 似水无痕。明夕何夕 君已陌路。才会相思 便害相思。人来人往 繁华似锦。回首万年 情衷伊人。生能尽欢 死亦无憾。执手若无 泪溅花上。花开花落 人世无常。入我心者 待以君王。为醉而醉 似醉非醉。伤心鸿影 爱已惘然。只要你要 只要我有。日久生情 日久情疏。忧佳相随 风雨无悔。有生之年 誓死娇宠引喻山河 指日可诚。水上鸳鸯 云中翡翠。天荒地老 海誓山盟。生则同襟 死则同穴。生有此女 夫复何求""".split("。")setup(1280,720) # 设置窗口大小colormode(255) # 使用的颜色模式, 整数还是小数up()a, b = -500, 280goto(a,b)bgcolor("black")down()def w(str_,b): bgcolor( random.randint(0,255),random.randint(0,255),random.randint(0,255)) # 随机生成RGB值, 每次调用函数改变背景颜色 for i in range(len(str_)): up() goto(a+100*i,b) down() size = random.randint(12,68) # 随机字体大小 color( random.randint(0,255),random.randint(0,255),random.randint(0,255)) # 随机字体颜色 write(str_[i], align="center",font=("楷体",size)) for k in range(4): for i in range(7): w(str_[i+7*k],b-100*i) reset() # 清屏 for i in range(7): w(str_[i+7*4],b-100*i) |

简单的图形例子
主要是通过改变角度和位置偏移, 做出各种效果
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
from turtle import *speed(0)bgcolor("white") pencolor("MediumAquamarine")h = 10for j in range(360): for i in range(4): forward(h) right(90) right(3) h = h*1.01 |




Lsystem 的应用
实质是通过不断变换规则, 绘制出各种发杂图形
以下符号字符的几何解释。
| # | 字符 | 含义 |
|---|---|---|
| 1 | F |
按行绘制一条线向前移动 |
| 2 | f |
按线条长度向前移动而不绘制线条 |
| 3 | + |
通过转动角度向左转动 |
| 4 | - |
通过转动角度向右转动 |
| 5 | / | 反向(即:转动180度) |
| 6 | [ |
将当前绘图状态推入堆栈 |
| 7 | ] |
从堆栈弹出当前绘图状态 |
| 8 | # |
按线宽增量增加线宽 |
| 9 | ! |
通过线宽增量减小线宽 |
| 10 | @ |
绘制带有线宽半径的点 |
| 12 | } |
关闭多边形并用填充颜色填充 |
| 13 | < |
将线长乘以线长比例因子 |
| 14 | > |
将线长除以线长比例因子 |
| 15 | & |
交换+和 - 的含义 |
| 16 | ( |
通过转动角度增量减小转动角度 |
| 17 | ) |
通过转动角度增量来增加转动角度 |
| 18 | { |
打开多边形 |
函数介绍
- draw_path(length, angle, path, expalnation)
- 主要用来绘制海龟行走路径
- length ---->每次行走的距离
- angle ---->偏移的角度
- path ---->初始路径图案,即0阶的形状
- expalnation ---->用来记录打印每一步操作
- 主要用来绘制海龟行走路径
- apply_rules(path, rules)
- 主要是转换每一阶段的path
- path ---->初始路径图案,即0阶的形状
- rules ---->转换的规则
- 主要是转换每一阶段的path
- getColor()
- 提供一个随机rgb值
- initialization()
- 初始化各种参数
- Introduction(x=-600, y=-350)
- 注解
- 默认海龟初始位置(-600,-350)
- 注解
- run(n,angle,length,path,rules)
- 启动程序
实现如下:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# -*- coding: utf-8 -*-# Time : 2019/4/5 22:20# Author : Mifen# Email : 2952277346@qq.com# Github : https://github.com/Amd794import timeimport turtle as tfrom turtle import *setup(1280,720)t.speed(0)t.pensize(1)length = 5path = 'FX'angle = 25up()color("#262626;")goto(-600, 300)write('Author:Mifen', font=("微软雅黑", 18))goto(-600, 250)write('E-mail :2952277346@qq.com', font=("微软雅黑", 18))goto(-600, 200)write('Code :https://github.com/Amd794/Python123', font=("微软雅黑", 18))goto(-600, -350)down()expalnation = { 'F': '画线', 'x': '-', '+': '逆时针旋转', '-': '顺时针旋转', '[': '记录当前位置', ']': '恢复上一个位置', 'a': '上色', 'b': '上色', 'c': '上色'}rules = { 'F': 'aFF-[b-F+F]+[c+F-F]', 'X': 'aFF+[b+F]+[c-F]'}def draw_path(path, expalnation): posList, angleList = [], [] t.up() t.goto(0, -350) t.down() t.lt(90) for symbol in path: if symbol == 'F': t.forward(length) elif symbol == '+': t.left(angle) elif symbol == '-': t.rt(angle) elif symbol == '[': posList.append(t.pos()) angleList.append(t.heading()) elif symbol == 'a': t.pensize(3) t.color("#8c503c") elif symbol == 'b': t.pensize(2) t.color("#4ab441") elif symbol == 'c': t.pensize(2) t.color("#18b418") elif symbol == ']': t.up() t.home() t.goto(posList.pop()) t.left(angleList.pop()) t.down()def apply_rules(path, rules): L = [_ for _ in path] for i in range(len(L)): symbol = L[i] if symbol == 'F': L[i] = rules[symbol] if symbol == 'X': L[i] = rules[symbol] path = ''.join(L) return pathfor _ in range(5): path = apply_rules(path, rules)draw_path(path, expalnation) |
综合以上, 来一个整合:
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# -*- coding: utf-8 -*-# Time : 2019/4/6 22:45# Author : Mifen# Email : 2952277346@qq.com# Github : https://github.com/Amd794from turtle import *import timeimport turtle as tdef gotopos(x, y): up() goto(x, y) down() ht()def author(): pensize(2) gotopos(610, -315) lt(-90) fd(80) pensize(1) lt(-270) gotopos(525, -330) color("#772a2b") write("Mifen", font=("华文隶书", 24)) gotopos(409, -360) write("2952277346@qq.com", font=("华文隶书", 18)) gotopos(250, -390) write("https://github.com/Amd794/Python123", font=("华文隶书", 18))def apply_rules(path, rules): L = [_ for _ in path] for i in range(len(L)): symbol = L[i] if symbol == 'F': L[i] = rules[symbol] if symbol == 'X': L[i] = rules[symbol] path = ''.join(L) return pathdef draw_path(path): posList, angleList = [], [] for symbol in path: if symbol == 'F': t.forward(length) elif symbol == '+': t.left(angle) elif symbol == '-': t.rt(angle) elif symbol == '[': posList.append(t.pos()) angleList.append(t.heading()) elif symbol == 'a': t.pensize(3) t.color("#867b68") elif symbol == 'b': t.pensize(2) t.color("#867b68") elif symbol == 'c': t.pensize(2) t.color("#867b68") elif symbol == ']': t.up() t.home() t.goto(posList.pop()) t.left(angleList.pop()) t.down()def writez(x, y, str_, size=56, font="华文行楷"): gotopos(x, y) write(str_, font=(font, size))setup(1280, 800)speed(5)bgcolor("#9c917f")color("#afa697")begin_fill()gotopos(0, -400)circle(400)end_fill()author()color("#7d776d")s = "愿天化作比翼鸟"s2 = "在地愿为连理枝"for i in range(len(s)): writez(560, 350 - i * 50, s[i], 36)for i in range(len(s2)): writez(460, 350 - i * 50, s2[i], 36)color("#888475")writez(-50, 100, "我")writez(-50, 40, "的")writez(-160, 0, "心", 96)writez(-50, 0, "月", 176)writez(33, -30, "代", 62)writez(-18, -95, "表", 78)writez(-213, -210, "亮", 196)gotopos(249, -26)color("#867b68")speed(0)gotopos(-650, -100)length = 6path = 'F'angle = 27rules = { 'F': 'aFF[b-F++F][c+F--F]c++F--F', 'X': 'aFF+[b+F]+[c-F]'}for _ in range(4): path = apply_rules(path, rules)draw_path(path)gotopos(570, -330)done() |

[Python] 震惊, 我居然用Python干这种事ꈍ .̮ ꈍ的更多相关文章
- 震惊!几道Python 理论面试题,Python面试题No18
本面试题题库,由公号:非本科程序员 整理发布 第1题: 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候 ...
- Python 之父谈放弃 Python:我对核心成员们失望至极!
Python 之父讲述退位原因,以及 Python 的未来将何去何从. 在 Python 社区,Python 的发明者 Guido Van Rossum 被称为 “仁慈的终生独裁者”(BDFL,B ...
- python 历险记(三)— python 的常用文件操作
目录 前言 文件 什么是文件? 如何在 python 中打开文件? python 文件对象有哪些属性? 如何读文件? read() readline() 如何写文件? 如何操作文件和目录? 强大的 o ...
- 孤荷凌寒自学python第四十天python 的线程锁RLock
孤荷凌寒自学python第四十天python的线程锁RLock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 因为研究同时在多线程中读写同一个文本文件引发冲突,所以使用Lock锁尝试同步, ...
- 孤荷凌寒自学python第三十九天python 的线程锁Lock
孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...
- 转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
- Python - 翻译Talk Python To Me (和我聊Python) 播客
“和我聊Python”是一个美国的聊天播客,英文名Talk Python To Me,类似于喜马拉雅的音频课程节目,只不过这个主题是编程语言Python.该节目从2015年的节目到现在,已经超过256 ...
- 【python之路1】python安装与环境变量配置
直接搜索 Python,进入官网,找到下载,根据个人电脑操作系统下载相应的软件.小编的是windows os .下载python-2.7.9.msi 安装包 双击安装程序,进入安装步骤.在安装过程中 ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
随机推荐
- Linked List
链表是线性表的一种.线性表是最基本,最简单也是最常见的一种数据结构.线性表中数据元素之间的关系是一对一的关系,除了第一个和最后一个数据元素外,其他数据元素都是首尾相接的. 线性表有两种存储方式,一种是 ...
- Delphi 在DLL中使用DevExpress控件时出错解决办法
测试环境 DevExpress VCL 14.1.3 和XE7 问题:在dll使用cxGrid控件时 如果不添加列标题 则不报错 查询无数据集显示,如果加上标题 就报错了 这段为报错部分 fun ...
- HTML超级链接详细讲解
超级链接是网站中使用比较频繁的HTML元素,因为网站的各种页面都是由超级链接串接而成,超级链接完成了页面之间的跳转.超级链接是浏览者和服务器的交互的主要手段,在后面的技术中会逐步深化学习. — 注意 ...
- 分形之树(Tree)
似乎每一个有关分形的教程都要讲到分形树,大概是因为树是生活中最常见的分形实物吧.这一节将展示下如何一步一步地生长出一棵树来.其实现算法不难,就是在每一次生长迭代中,使线段生长出几条新的线段来. 核心代 ...
- Spring与多线程
前言背景 在做新项目,作为中间件的项目,主要做数据服务.这次想把项目做的简洁一些,之前用的什么ActiveMq等中间件产品,这次全部不用,能自己实现就自己实现.自己用BlockingQueue阻塞队列 ...
- Windows核心编程:第14章 探索虚拟内存
Github https://github.com/gongluck/Windows-Core-Program.git //第14章 探索虚拟内存.cpp: 定义应用程序的入口点. // #inclu ...
- 纸壳CMS主题增强,支持主题中加入模板
背景 在之前,纸壳CMS的主题仅仅只是CSS样式,并不支持在主题下使用模板来构建不同的HTML结构.现在我们对主题功能做了增强,可以在主题下添加各自的模板,这样在制作主题时,就会更加自由.不仅如此,新 ...
- java实现点选汉字验证码
package com.rd.p2p.web; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; im ...
- [WC2005]双面棋盘(线段树+并查集)
线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Co ...
- EF6使用Mysql,踏过的那些坑
在vs2013中使用mysql连接entityFramework经常会遇到这个问题:您的项目引用了最新实体框架:但是,找不到数据连接所需的与版本兼容的实体框架数据提供程序.请退出此向导,安装兼容提供程 ...