實戰 | 教你用Python畫各種版本的圣誕樹

前言

一年一度的圣誕節馬上就要到了,看到朋友圈好多小伙伴已經開始炫耀自己制作的圣誕樹了。今天給大家分享通過Pythoy用Turtle庫來畫圣誕樹。(復制即可使用)

Turtle庫是Python語言中一個很流行的繪制圖像的函數庫,想象一個小烏龜,在一個橫軸為x、縱軸為y的坐標系原點,(0,0)位置開始,它根據一組函數指令的控制,在這個平面坐標系中移動,從而在它爬行的路徑上繪制了圖形。

1.方塊圣誕樹

import turtle

screen = turtle.Screen()

screen.setup(375, 700)

circle = turtle.Turtle()

circle.shape('circle')

circle.color('red') circle.speed('fastest')

circle.up()

square = turtle.Turtle()

square.shape('square')

square.color('green')

square.speed('fastest')

square.up()

circle.goto(0, 280)

circle.stamp()

k = 0

for i in range(1, 13):

y = 30 * i

for j in range(i - k):

x = 30 * j

square.goto(x, -y + 280)

square.stamp()

square.goto(-x, -y + 280)

square.stamp()

if i % 4 == 0:

x = 30 * (j + 1)

circle.color('red')

circle.goto(-x, -y + 280)

circle.stamp()

circle.goto(x, -y + 280)

circle.stamp()

k += 3

if i % 4 == 3:

x = 30 * (j + 1)

circle.color('yellow')

circle.goto(-x, -y + 280)

circle.stamp()

circle.goto(x, -y + 280)

circle.stamp()

square.color('brown')

for i in range(13, 17):

y = 30 * i

for j in range(2):

x = 30 * j

square.goto(x, -y + 280)

square.stamp()

square.goto(-x, -y + 280)

square.stamp()

效果展示:

2.線條圣誕樹

import turtle

# 定義圣誕樹的綠葉函數

def tree(d, s):

if d <= 0:

return

turtle.forward(s)

tree(d - 1, s * .8)

turtle.right(120)

tree(d - 3, s * .5)

turtle.right(120)

tree(d - 3, s * .5)

turtle.right(120)

turtle.backward(s)

n = 100

""" 設置繪圖速度

'fastest' : 0

'fast' : 10

'normal' : 6

'slow' : 3

'slowest' : 1

"""

turtle.speed('fastest') # 設置速度

turtle.left(90)

turtle.forward(3 * n)

turtle.color("orange", "yellow")

turtle.left(126)

# turtle.begin_fill()

for i in range(5):

turtle.forward(n / 5)

turtle.right(144)

turtle.forward(n / 5)

turtle.left(72)

turtle.end_fill()

turtle.right(126)

turtle.color("dark green")

turtle.backward(n * 4.8)

# 執行函數

tree(15, n)

turtle.backward(n / 5)

效果展示:

3.豪華圣誕樹

import turtle as t #as就是取個別名,后續調用的t都是turtle

from turtle import *

import random as r

import time

n = 100.0

speed("fastest") #定義速度

screensize(bg='black') #定義背景顏色,可以自己換顏色 left(90)

forward(3*n)

color("orange", "yellow")#定義最上端星星的顏色,外圈是orange,內部是yellow

begin_fill()

left(126)

for i in range(5): #畫五角星

forward(n/5)

right(144) #五角星的角度

forward(n/5)

left(72) #繼續換角度

end_fill()

right(126)

def drawlight():#定義畫彩燈的方法

if r.randint(0, 30) == 0:#如果覺得彩燈太多,可以把取值范圍加大一些,對應的燈就會少一些

color('tomato')#定義第一種顏色

circle(6)#定義彩燈大小

elif r.randint(0,30) == 1:

color('orange')#定義第二種顏色

circle(3)#定義彩燈大小

else:

color('dark green')#其余的隨機數情況下畫空的樹枝

color("dark green")#定義樹枝的顏色

backward(n*4.8)

def tree(d, s):#開始畫樹

if d <= 0: return

forward(s)

tree(d-1, s*.8)

right(120)

tree(d-3, s*.5)

drawlight()#同時調用小彩燈的方法

right(120)

tree(d-3, s*.5)

right(120)

backward(s)

tree(15, n)

backward(n/2)

for i in range(200):#循環畫最底端的小裝飾

a = 200 - 400 * r.random()

b = 10 - 20 * r.random()

up()

forward(b)

left(90)

forward(a)

down()

if r.randint(0, 1) == 0:

color('tomato')

else:

color('wheat')

circle(2)

up()

backward(a)

right(90)

backward(b)

t.color("dark red","red")#定義字體顏色

t.write("Merry Christmas",align ="center",font=("Comic Sans MS",40,"bold"))#定義文字、位置、字體、大小

def drawsnow():#定義畫雪花的方法

t.ht() #隱藏筆頭,ht=hideturtle

t.pensize(2) #定義筆頭大小

for i in range(200): #畫多少雪花

t.pencolor("white") #定義畫筆顏色為白色,其實就是雪花為白色

t.pu() #提筆,pu=penup

t.setx(r.randint(-350,350)) #定義x坐標,隨機從-350到350之間選擇

t.sety(r.randint(-100,350)) #定義y坐標,注意雪花一般在地上不會落下,所以不會從太小的縱座軸開始

t.pd() #落筆,pd=pendown

dens = 6 #雪花瓣數設為6

snowsize = r.randint(1,10) #定義雪花大小

for j in range(dens): #就是6,那就是畫5次,也就是一個雪花五角星

#t.forward(int(snowsize)) #int()取整數

t.fd(int(snowsize))

t.backward(int(snowsize))

#t.bd(int(snowsize)) #注意沒有bd=backward,但有fd=forward,小bug

t.right(int(360/dens)) #轉動角度

drawsnow()#調用畫雪花的方法

t.done() # 完成,否則會直接關閉

效果展示:

4.附贈動態圣誕賀卡

代碼:

# -*- coding: utf-8 -*-

import turtle as T

import random

import time

# 繪圖區域

t = T.Turtle()

# 畫布大小

w = T.Screen()

t.hideturtle() # 隱藏畫筆

t.getscreen().tracer(5, 0)

w.screensize(bg='maroon')

t.left(90) t.up()

t.forward(280)

t.down()

t.pensize(3)

# 畫五角星

n=100

t.color("orange","yellow")

t.begin_fill()

t.left(126)

for i in range(5):

t.forward(n/5)

t.right(144)

t.forward(n/5)

t.left(71)

t.end_fill()

t.left(60)

t.pensize(8)

t.forward(60)

t.right(20)

t.right(116)

t.pensize(6)

# 畫樹冠

t.color('dark green')

n=130

for i in range(6):

time.sleep(0.5)

a=1+i/2

t.begin_fill()

t.left(90)

t.forward(n*a*0.707)

t.left(135)

t.forward(n*a)

t.left(135)

t.forward(n*a*0.707)

t.end_fill()

t.up()

t.left(90)

t.forward(n*a*0.707/3)

t.left(135)

t.forward(n*a/6)

t.left(135)

t.down()

# 畫樹干

t.up()

t.right(135)

t.forward(30)

t.right(90)

t.forward(157)

t.down()

t.color('saddlebrown')

t.begin_fill()

t.forward(80)

t.right(90)

t.forward(45)

t.right(90)

t.forward(80)

t.right(90)

t.forward(45)

t.end_fill()

t.up()

t.backward(45)

t.right(90)

t.backward(470)

t.down()

# 畫燈

def light(l,t):

t.pensize(3)

colors = ["magenta","darkorange","red","blue"]

for i in range(l):

time.sleep(0.2)

b = 70+16*i

a = b/2*random.randint(-100,100)/100

t.up()

t.forward(b)

t.left(90)

t.forward(a)

t.down()

t.color("lightyellow",colors[i%4])

t.begin_fill()

t.circle(10)

t.end_fill()

t.up()

t.backward(a)

t.right(90)

t.backward(b)

t.down()

t.pensize(1)

# 畫雪花

def snow(m,t):

for i in range(m):

a = 400 - 800 * random.random()

b = 600 - 800 * random.random()

t.up()

t.forward(b)

t.left(90)

t.forward(a)

t.down()

t.color('white')

t.begin_fill()

t.circle(1)

t.end_fill()

t.up()

t.backward(a)

t.right(90)

t.backward(b)

light(24,t)

snow(600, t)

# 文字

t.goto(-200,200)

my_word = ("Merry Christmas")

t.write(my_word,font=("Edwardian Script ITC",40,"bold"))

time.sleep(0.3)

t.goto(-100,50)

my_word = ("and")

t.write(my_word,font=("Edwardian Script ITC",50,"bold"))

time.sleep(0.3)

t.goto(-150,-100)

my_word = ("Happy New Year")

t.write(my_word,font=("Edwardian Script ITC",40,"bold"))

time.sleep(0.3)

t.clear()

w.screensize(bg='black')

t.goto(-200,0)

my_word = ("Prudued by: Justine")

t.write(my_word,font=("Edwardian Script ITC",45,"bold"))

t.goto(0,-100)

my_word = ("Dec. 24th, 2019")

t.write(my_word,font=("Edwardian Script ITC",20,"bold"))

time.sleep(5)

效果展示:

圖片為動態效果哦~

感興趣的話就趕緊嘗試一下吧!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容