代码详解

(一)绘制画幕

首先绘制画幕,命令说明如下:

screensize(width, height, bg=color):设置画幕大小及颜色

setup(p1, p2):设置画幕大小,当 p1、p2 为小数时表示屏幕占比;当 p1、p2 为整数时表示像素

tracer(speed):设置绘制速度,speed越大表示绘制速度越快

def get_screen(width, height, color, speed):

# 创建画幕

screen_obj = turtle.Screen()

# 画布大小:(width, height),颜色:color

screen_obj.screensize(width, height, bg=color)

screen_obj.setup(1.0, 1.0)

# speed倍加速

screen_obj.tracer(speed)

return screen_obj

(二)绘制落花

在确定落花数量的情况下,我们首先要评估落花的范围,这里通过两句语句来约束落花的范围(落花数量越多,当然地落花范围也就越大):

# 有正有负就可以让画笔往二个方向走

x = flower - 4 * flower * random()

# 花瓣整体宽度(-10, 10)

y = 10 - 20 * random()

然后我们来讲讲 turtle 常用的几个命令吧:

首先,我们得明确,对于 turtle 画布来说,其为一个 xOy 的平面,画布中心为原点 O ;对于 turtle 画笔来说,其有一个初始方向,指向 x 轴正方向。

penup():起笔(可以想象成画画的时候沾墨之后提笔)

forward():向前移动

backward():向后移动

left(degree):逆时针旋转 degree 度

right(degree):顺时针旋转 degree 度

pendown():落笔

pencolor(color):笔墨颜色为 color

circle(r):画一个半径为 r 的圆

代码如下:

def draw_petal(turtle_obj, flower):

# 绘制掉落的花瓣

for i in range(int(flower / 2)):

# 有正有负就可以让画笔往二个方向走

x = flower - 2 * flower * random()

# 花瓣整体宽度(-10, 10)

y = 10 - 20 * random()

# 提笔,向前y,左转90,走x,落笔

turtle_obj.penup()

turtle_obj.forward(y)

turtle_obj.left(90)

turtle_obj.forward(x)

turtle_obj.pendown()

# 珊瑚色

turtle_obj.pencolor("lightcoral")

# 画圆

turtle_obj.circle(1)

# 回到起点

# 提笔,后退x,右转90,后退y,落笔

turtle_obj.penup()

turtle_obj.backward(x)

turtle_obj.right(90)

turtle_obj.backward(y)

turtle_obj.pendown()

(三)绘制树枝与花瓣

读者会发现,在 drwa_tree 方法中,又出现了两次 drwa_tree 方法,这是一个递归的方法,可以简单理解为一棵树最下面的树枝最少且最粗,越往上树枝数量增加但是变细了。Axitrader代理申请http://www.kaifx.cn/broker/ax...,如果读者看不懂如下代码的话,可以查看《Turtle(python)画分形树理解递归》[3]文章。

def draw_tree(turtle_obj, branch, tree_color):

# 设置一个最小分支长度

min_branch = 4

if branch > min_branch:

if branch < 8:

# 以0.5的概率,向左、右分支

if randint(0, 1) == 0:

# 左为白色

turtle_obj.pencolor("snow")

else:

# 右为珊瑚色

turtle_obj.pencolor("lightcoral")

# 枝干

turtle_obj.pensize(branch / 2)

elif 8 <= branch <= 16:

# 以0.33的概率,分为左、中、右分支

if randint(0, 2) == 0:

# 左为白色

turtle_obj.pencolor("snow")

else:

# 中、右为珊瑚色

turtle_obj.pencolor("lightcoral")

# 树枝

turtle_obj.pensize(branch / 4)

else:

# 褐色

turtle_obj.pencolor(tree_color)

# 细枝

turtle_obj.pensize(branch / 10)

# 最开始的树干长度

turtle_obj.forward(branch)

# 随机度数因子

a = 1.5 * random()

# 顺时针旋转随机角度(0~30度)

turtle_obj.right(20 * a)

# 随机长度因子

b = 1.5 * random()

# 往右画,直到画不动为止

draw_tree(turtle_obj, branch - 10 * b, tree_color)

# 左转随机角度

turtle_obj.left(40 * a)

# 往左画,直到画不动位置

draw_tree(turtle_obj, branch - 10 * b, tree_color)

# 右转一定角度

turtle_obj.right(20 * a)

# 提笔

turtle_obj.penup()

# 递归结束回到起点

turtle_obj.backward(branch)

turtle_obj.pendown()

(四)绘制多棵树

这部分代码的前半部分是用来约束树根的位置的,为了使树可以在图像中显示地较为完成,较大的树根应该更靠近于画幕底端,且不能太靠近两边,其余部分代码就很容易理解了。

def trees(tree_num):

# 颜色

color = ['brown', 'tan', 'black']

for j in range(tree_num):

# 树干颜色

tree_color = color[randint(0, len(color) - 1)]

# 画笔大小

pensize = randint(2, 5)

# 前进像素

forward = ((-1) ** pensize) * pensize * randint(20, 50)

# 后退像素

if pensize <= 3:

backward = ((-1) ** pensize) * (5 - pensize) * randint(10, 15)

else:

backward = pensize * randint(45, 50)

# 创建画笔

turtle_obj = turtle.Turtle()

# 画笔粗细

turtle_obj.pensize(pensize)

# 提笔,向前forward,左转90,backward,落笔

turtle_obj.penup()

turtle_obj.forward(forward)

turtle_obj.left(90)

turtle_obj.backward(backward)

turtle_obj.pendown()

# 画笔颜色:褐色

turtle_obj.pencolor(tree_color)

# 枝干粗细

branch = pensize * 15

# 落花数

flowers = branch

# 第j棵树

draw_tree(turtle_obj, branch, tree_color)

# 花瓣

draw_petal(turtle_obj, flowers)

二、完整代码

(一)完整代码

给出完整代码:

import turtle

from random import random

from random import randint

def draw_petal(turtle_obj, flower):

# 绘制掉落的花瓣

for i in range(int(flower)):

# 有正有负就可以让画笔往二个方向走

x = flower - 4 * flower * random()

# 花瓣整体宽度(-10, 10)

y = 10 - 20 * random()

# 提笔,向前y,左转90,走x,落笔

turtle_obj.penup()

turtle_obj.forward(y)

turtle_obj.left(90)

turtle_obj.forward(x)

turtle_obj.pendown()

# 珊瑚色

turtle_obj.pencolor("lightcoral")

# 画圆

turtle_obj.circle(1)

# 回到起点

# 提笔,后退x,右转90,后退y,落笔

turtle_obj.penup()

turtle_obj.backward(x)

turtle_obj.right(90)

turtle_obj.backward(y)

turtle_obj.pendown()

# 画树枝部分

def draw_tree(turtle_obj, branch, tree_color):

# 设置一个最小分支长度

min_branch = 4

if branch > min_branch:

if branch < 8:

# 以0.5的概率,向左、右分支

if randint(0, 1) == 0:

# 左为白色

turtle_obj.pencolor("snow")

else:

# 右为珊瑚色

turtle_obj.pencolor("lightcoral")

# 枝干

turtle_obj.pensize(branch / 2)

elif 8 <= branch <= 16:

# 以0.33的概率,分为左、中、右分支

if randint(0, 2) == 0:

# 左为白色

turtle_obj.pencolor("snow")

else:

# 中、右为珊瑚色

turtle_obj.pencolor("lightcoral")

# 树枝

turtle_obj.pensize(branch / 4)

else:

# 褐色

turtle_obj.pencolor(tree_color)

# 细枝

turtle_obj.pensize(branch / 10)

# 最开始的树干长度

turtle_obj.forward(branch)

# 随机度数因子

a = 1.5 * random()

# 顺时针旋转随机角度(0~30度)

turtle_obj.right(20 * a)

# 随机长度因子

b = 1.5 * random()

# 往右画,直到画不动为止

draw_tree(turtle_obj, branch - 10 * b, tree_color)

# 左转随机角度

turtle_obj.left(40 * a)

# 往左画,直到画不动位置

draw_tree(turtle_obj, branch - 10 * b, tree_color)

# 右转一定角度

turtle_obj.right(20 * a)

# 提笔

turtle_obj.penup()

# 递归结束回到起点

turtle_obj.backward(branch)

turtle_obj.pendown()

def get_screen(width, height, color, speed):

# 创建画幕

screen_obj = turtle.Screen()

# 画布大小:(width, height),颜色:color

screen_obj.screensize(width, height, bg=color)

screen_obj.setup(1.0, 1.0)

# speed倍加速

screen_obj.tracer(speed)

return screen_obj

def trees(tree_num):

# 颜色

color = ['brown', 'tan', 'black']

for j in range(tree_num):

# 树干颜色

tree_color = color[randint(0, len(color) - 1)]

# 画笔大小

pensize = randint(2, 5)

# 前进像素

forward = ((-1) ** pensize) * pensize * randint(20, 50)

# 后退像素

if pensize <= 3:

backward = ((-1) ** pensize) * (5 - pensize) * randint(10, 15)

else:

backward = pensize * randint(45, 50)

# 创建画笔

turtle_obj = turtle.Turtle()

# 画笔粗细

turtle_obj.pensize(pensize)

# 提笔,向前forward,左转90,backward,落笔

turtle_obj.penup()

turtle_obj.forward(forward)

turtle_obj.left(90)

turtle_obj.backward(backward)

turtle_obj.pendown()

# 画笔颜色:褐色

turtle_obj.pencolor(tree_color)

# 枝干粗细

branch = pensize * 15

# 落花数

flowers = branch

# 第j棵树

draw_tree(turtle_obj, branch, tree_color)

# 花瓣

draw_petal(turtle_obj, flowers)

if __name__ == '__main__':

# 创建画幕

my_screen_width = 800

my_screen_height = 600

my_screen_color = 'wheat'

my_screen_speed = 5

my_screen_obj = get_screen(my_screen_width, my_screen_height,

my_screen_color, my_screen_speed)

# 樱花树

# 棵数

my_tree_num = 5

trees(my_tree_num)

# 点击关闭画布

my_screen_obj.exitonclick()

用python画花瓣-Python:绘制樱花树相关推荐

  1. 用python画花瓣-Python——画一棵漂亮的樱花树

    代码货币符号分享给大家 樱花树 代码 import turtle as T import random import time 画樱花的躯干(60,t) def Tree(branch, t): ti ...

  2. 用python画花瓣-Python竟能画这么漂亮的花,帅呆了(代码分享)

    阅读本文大概需要3分钟 关于函数和模块讲了这么久,我一直想用一个好玩有趣的小例子来总结一下,同时也作为实战练习一下. 趣味编程其实是最好的学习途径,回想十几年前我刚毕业的时候,第一份工作就给手机上写a ...

  3. 用python画花瓣-Python教程:使用Turtles画出带有花瓣的花

    简单画出一朵带有花瓣的花 # -*- coding:utf-8 -*- import turtle # create window and turtle window = turtle.Screen( ...

  4. 用python画皇冠_【推荐】手把手教你如何用Python画一棵漂亮樱花树含源码

    最近给大家整理了一下,挑了一些我觉得不错的代码分享给大家手把手教你如何用Python画一棵漂亮樱花树含源码. 动态生成樱花 效果图(这个是动态的): import turtle as T import ...

  5. python画代码-python画樱花树代码 具体代码介绍

    1.python画樱花树代码为: import turtle as T import random import time 2.# 画樱花的躯干(60,t) def Tree(branch, t): ...

  6. 怎么用python画花瓣_怎么用python画花朵

    怎么用python画花朵?下面给大家讲解一下具体步骤: 第一步,打开菜单栏,输入idle,打开shell. 第二步,新建一个文件,并命名. 第三步,导入turtle模块,创建一个新窗口用于绘图,再创建 ...

  7. 用python画花瓣-用python画花瓣

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. p_line(t, n, step_length, step_angle ...

  8. 用python画花瓣-怎么用python画花朵

    怎么用python画花朵?下面给大家讲解一下具体步骤: 第一步,打开菜单栏,输入idle,打开shell. 第二步,新建一个文件,并命名. 第三步,导入turtle模块,创建一个新窗口用于绘图,再创建 ...

  9. python画曲线-Python绘制各种简单优美曲线

    原标题:Python绘制各种简单优美曲线 matplotlib是著名的Python绘图库,它提供了一整套绘图API,十分适合交互式绘图.,解决数据分析和可视化问题,其实也是Python的拿手好戏.另外 ...

最新文章

  1. Init进程和进程 ④
  2. 花几万元报IT培训班,只为进入互联网大厂:有人年薪百万,有人黯然退场
  3. 2019年十二周总结
  4. Java教程之JDBC中的常用接口和类
  5. 成都东软学院新生周赛(五)
  6. cocos2dx标准容器_cocos2dx的模板容器简单使用(Vector,Map,Value)
  7. Java Swing Mysql实现的Ktv点歌系统项目源码附带视频运行教
  8. EL与JSTL表达式代码示例
  9. 数据库基础:MySQL必备的三个工具
  10. python如何退出模块_如何将一个 Python 函数进行模块化封装
  11. matlab半波整流怎么做,基于Matlab的单相半波可控整流电路的设计与仿真.doc
  12. 那些年,我们一起踩过的 “Android 坑”
  13. 在ECS中安装Docker在内部访问RDS数据库
  14. 穿过网络防火墙监视的木马下载器(转)
  15. 用Visio画深度学习模型矢量图
  16. 解决金山打字通不能缩小窗口问题
  17. 第六周 day6 python学习笔记
  18. php twig if,如何使用短语法使用Twig检查变量是否存在以及是否为空
  19. Asia's pollution exodus: Firms struggle to woo top talent 逃离亚洲空气污染:企业难以吸引顶尖人才
  20. 基于参考图像的人脸组成编辑

热门文章

  1. MVVM框架下,WPF实现Datagrid里的全选和选择
  2. 奇淫异巧之 PHP 后门
  3. UI分层中使用PageFactory
  4. [译]ASP.NET Core 2.0 网址重定向
  5. Git之不明觉厉11-利其器source tree
  6. 苹果系统里面 dictionary 如何加入中文词典
  7. 【转】ASP.NET AJAX入门系列
  8. php 两次post,ajax跨域往php程序post数据时,php程序总是执行两次的解决办法
  9. 软件测试用python一般用来做什么-Python简直是万能的,这5大主要用途你一定要知道!...
  10. 以下选项不是python文件读操作的是-以下选项中,不是Python中文件操作的相关函数是()...