更多示例代碼下載地址 : 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
random
str_
=
"""
守一段情 念一個人。
時光不老 我們不散。
廝守終生 不離不棄。
天暗下來 你就是光。
亡魂溺海 止於終老。
生死挈闊 與子成說。
柔情似水 佳期如夢。
我中有你 你中有我。
青山不老 為雪白頭。
心若向陽 無畏悲傷。
一人一心 白首不離。
心如荒島 囚我終老。
我的世界 只有你懂。
你若安好 便是晴天。
心有靈犀 一點就通。
廝守海角 非你不娶。
執子的手 漫漫的走。
執子之手 與子偕老。
山河拱手 為君一笑。
紅塵初妝 山河無疆。
千秋功名 一世葬你。
既不回頭 何必不忘。
既然無緣 何須誓言。
今日種種 似水無痕。
明夕何夕 君已陌路。
才會相思 便害相思。
人來人往 繁華似錦。
回首萬年 情衷伊人。
生能盡歡 死亦無憾。
執手若無 淚濺花上。
花開花落 人世無常。
入我心者 待以君王。
為醉而醉 似醉非醉。
傷心鴻影 愛已惘然。
只要你要 只要我有。
日久生情 日久情疏。
憂佳相隨 風雨無悔。
有生之年 誓死嬌寵
引喻山河 指日可誠。
水上鴛鴦 雲中翡翠。
天荒地老 海誓山盟。
生則同襟 死則同穴。
生有此女 夫復何求"""
.split("。")
setup(
1280
,
720
)
# 設置窗口大小
colormode(
255
)
# 使用的顏色模式, 整數還是小數
up()
a, b
=
-
500
,
280
goto(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)
|
簡單的圖形例子
主要是通過改變角度和位置偏移, 做出各種效果
[Python]
純文本查看 復制代碼
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
=
10
for
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)
- 啟動程序
實現如下:
[Python]
純文本查看 復制代碼
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/Amd794
import
time
import
turtle as t
from
turtle
import
*
setup(
1280
,
720
)
t.speed(
0
)
t.pensize(
1
)
length
=
5
path
=
'FX'
angle
=
25
up()
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
path
for
_
in
range
(
5
):
path
=
apply_rules(path, rules)
draw_path(path, expalnation)
|
綜合以上, 來一個整合:
[Python]
純文本查看 復制代碼
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/Amd794
from
turtle
import
*
import
time
import
turtle as t
def
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
path
def
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
=
6
path
=
'F'
angle
=
27
rules
=
{
'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()
|