從Scratch到Python——python turtle
一種比pygame更加簡潔的實現

現在很多學校都開設了Scratch課程,學生可以利用Scratch創作豐富的作品,然而Scratch之后的圖形化編程語言學習什么內容,是一線老師和Scratch官方共同關注的問題。
轉載請注明出處:http://www.jianshu.com/p/99729c45c839
就目前來看可以選擇的有C語言、Logo、Python和SmallBasic。就我個人而言是傾向於Python的。因為C語言雖然經典,但是學了很久也不能做出可視的成型的作品,極大的降低了孩子們的積極性;Logo語言僅僅是一門玩具型的編程語言;Smallbasic和Logo語言的情況類似;而Python語言已經做為編程入門語言得到了廣泛的任何,相比於c語言,入門簡單,而且Python可以用很少的代碼完成復雜的工作,在以后的工作學習中都會用到,對於一般人來說C語言是屠龍之技,即便是在大學里的C語言通修課也是如此,而且目前部分大學的已經開始慢慢的把通識課的入門編程語言改成Python了。畢竟人生苦短我用Python呢。
但是Python作為一種文本編程語言,對於小學生來說還是有一定難度的,所以從Scratch到Python肯定需要一個過渡,我對於這個問題思考了很長時間,我覺得在學習了Scratch基礎上,結合Scratch來學習Python是合適的。
學習任何一種編程語言,首先要了解諸如變量、循環、分支判斷這些基本的程序結構,經過Scratch的學習,學生對於這些概念基本掌握,在學習Python的時候,用Scratch來描述程序,作為思維可視化的工具,有助於學生快速的掌握Python。
閑言少敘,下面我們就開始Python的學習,話說如果一開始就講Python的變量肯定會被吐槽,全部是文本,黑咕隆咚的窗口,沒什么意思啊,那么們就從窗口開始。
安裝Python
(從官網下載Python 3.6如果是xp下載3.5,然后看下基本的Python安裝和使用介紹,啟動IDLE)
啟動IDLE
安裝python之后,開始菜單,python,IDLE,就可以啟動了。
神奇的小烏龜
在正式學習Python之前我們先來體驗下用Python來繪制圖形,如果你看不懂也沒有關系,先照着教程把代碼查下來就是了,就像是聯系書法開始肯定有個臨摹的階段,我們先體驗,后面詳細講解為什么這么做
下面我們隆重的請我們的Python小烏龜入場。
首先在IDLE的代碼編輯器輸入以下代碼

然后單擊運行

解釋
我們來解釋下這段代碼
from turtle import *
是從Python的庫中導入turtle這個類,當導入的時候,其實小烏龜已經存在了,只是我們看不到而已。當你通過
forward(90)
命令讓小烏龜前進90個單位的時候憊懶的小烏龜才出現在舞台上,forward的意思是前進,forward后面括號里的是參數,描述烏龜前進的距離,這是一個固定的寫法。

是不是覺得眼熟呢,在Scratch,是不是有點像Scratch里面讓小貓動起來呢?

在turtle里面,默認畫筆是落下的,所以小箭頭移動的時候就會畫圖,我們記得scratch里面有一個抬筆積木,在turtle也有,不過是
penup()

from turtle import *
# 神龜前進100單位
forward(90)
penup()
# 抬筆
forward(90)
首先我通過penup()命令抬筆,然后利用goto(10,90)命令讓小烏龜移動到(10,90)
其實這個時候,調用前面的向前移動forward命令也不會留下痕跡的

繪制正方形
下面我們來繪制一個正方形,首先我們用scratch來實現繪制正方形這個功能,我們用最簡單的順序命令來實現
Scratch程序繪制正方形

可以看到
+首先拖動綠旗模塊到舞台
+然后清空舞台
+落筆
+讓小企鵝前進90步,然后右轉90°,等1s鍾
+重復以上步驟四次
+抬筆,准備下一次繪圖
這是一個典型的繪制正方形的程序,采用了順序結構來編制程序,便於理解。
接下來我們用python中的turtle庫實現這個程序
Python版本的正方形繪制程序

from turtle import *
# 神龜前進100單位
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
看,雖然一個是圖形編程,一個是文本編程,但是都成功的繪制出了正方形。下面我繼續完善,我們知道在Scratch中是可以改變畫筆屬性的,比如畫筆粗細,畫筆的顏色等等,在python也是可以的,看下面的表格
| - | - | - |
|---|---|---|
| Scratch代碼塊 | Python命令 | 作用 |
![]() |
pencolor() |
設定畫筆顏色,用顏色選擇器選擇顏色 |
![]() |
pencolor() |
Scratch通過數值,python通過顏色字符串設定顏色 |
![]() |
pensize() |
設定畫筆粗細 |
比如我們要畫一個邊框粗為4,顏色為紅色的正方形
Scratch版本

Python版本的畫正方形

代碼如下
from turtle import *
# 神龜前進100單位
pensize(4)
pencolor("red")
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
可以看到,我們用python里面的命令完成了與scratch相同的功能,是不是相當有趣呢?
變量
前面我們畫了一個邊長為90的正方形,如果我們想讓正方形的邊長是100怎么辦呢?我們先來看最原始的方法,那就是把scratch或者Python中代表邊長的數字90分別改成100:

你會發現這次不是正方形啊,哦,原來是我把最后一個右轉90°,也改成100,導致右轉了100°,你看,這樣一個個的修改不僅麻煩,而且容易出錯,怎么辦呢,我們用一個變量代表邊長。
變量是一個容器,里面存放着代表邊長的數字。
在Scratch中新建變量
經過前面多學習,大家已經掌握了在scratch中新建變量,下面我們新建一個代表邊長的變量side,然后把程序中代表邊長的100改成變量side

然后我們改變side值,就可以輕松的繪制不同邊長的正方形了
在Python中新建變量
python是一種解釋語言,無需聲明就可以新建變量,新建變量只需要用下面的語法
side = 100
這樣就新建了一個side變量,代表100,這里的=等號的含義是,把右側100的值放到變量side中,side代表100.
我們看如何用python來實現用變量來代表數值繪制正方形
from turtle import *
# 神龜前進100單位
side = 100
pensize(4)
pencolor("red")
forward(side)
right(90)
forward(side)
right(90)
forward(side)
right(90)
forward(side)
right(90)

那么,親愛的朋友,你能夠新建一個angle變量,代替角度嗎?
重復循環
在日常生活中,我們經常會遇到一個枯燥而重復的事情,為了從這些勞動擺脫出來,人們發明機器以及機器人,代替人類完成這些枯燥重復的事情。與人類不同的是,計算機特別擅長做簡單重復的事情,效率和准確率比我們人類要高很多。通過合理的使用重復循環,我們可以大大提高程序的效率。
from turtle import *
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
仔細觀察以上代表,是不是,是不是感覺有很多地方是重復的呢?一般在計算機中超過三次重復就可以考慮使用循環來簡化代碼
在scratch中,控制積木分類中有重復積木:

下面我們利用scratch中的循環來簡化代碼

仔細觀察以上代碼,想一想在重復4次內部應該放入那些積木塊呢?這樣代碼是不是簡單了很多?
Python循環
python中的循環,需要用到for...each...語句,在這里會涉及到python一個非常有意思的地方,縮進語法
from turtle import *
for each in range(4):
forward(90)
right(90)
執行以上代碼,會發現,出現了一個正方形,需要注意的是,forward(90)以及right(90)語句比for縮進了4個空格,這也是python的特點之一,縮進語法,這是for的固定寫法,大家要知道,而且一定不要漏掉冒號哦。
更多類似
有人說,不是python turtle小烏龜嗎,為什么只有箭頭呢?scratch舞台上有各種各樣的角色,python turtle只有個箭頭是不是太寒酸了呢?turtle也可以多種多樣哦!
需要改變箭頭的形狀要用到shape()命令,下面我們來試一下
from turtle import *
shape('turtle')
for each in range(4):
forward(90)
right(90)

有沒有覺得小烏龜太小了?我們來改變小烏龜的大小
from turtle import *
shape('turtle')
shapesize(5,5,5)
for each in range(4):
forward(90)
right(90)
運行以上代碼,是不是發現小烏龜變大了呢?

當然python turtle中小烏龜的形象不僅可以是小烏龜,箭頭,還是是圓和正方形。
小結:python urtle某種程度上跟logo小烏龜是比較類似的,肯定有人會疑問為什么不直接學習logo呢?因為logo基本上已經被淘汰了,我們最主要的目的還是學習python,python turtle以及結合scratch只是防止單純的學習python過於枯燥的弱點,當然真正的掌握了python以后就不會有這樣的感覺,基本上scratch大部分功能都可以用python turtle來實現,這樣就可以順利的幫助小孩子從scratch過渡到python。
先來看最經典的例子
在scratch教程中,一般開始都是先做一個小貓來回跑動的例子,來吸引小盆友,python turtle做這樣的例子其實很簡單的,我們先來看用scratch怎么做:

下面我們用python來實現,現在看不懂不要緊,看完后面的就能看懂了。
from turtle import *
shapesize(4,4,4)
penup()
x = 0
v = 5
while 1:
goto(x, 0)
x += v
if x < -200:
v = -v # 當箭頭到了左側邊界,讓x增加
if x > 200:
v = -v # 黨建頭到了右側邊界,讓x減少
以上代碼實現了箭頭來回走動,其實原理很簡單的v = 5跟

的作用類似,是用來設定角色移動的速度,而與

對應的則是以下代碼:
if x < -200:
v = -v
if x > 200:
v = -v
我來解釋下這段程序,首先導入必要的庫,然后利用shapesize()命令設置箭頭的大小,然后while循環的作用於scratch的重復類似,不停的執行以下代碼,首先讓箭頭移動到(0, 0)坐標,然后把x坐標增加步數v,然后判斷改變后的x坐標是否大於200,大於200則意味着箭頭超過了右側的邊界,那么x就應該向相反方向移動,這也就是scratch中的

含義,本來向右移動是讓x坐標不斷的增加步數v,如果要向左移動,就要減去步數,所以當箭頭的橫坐標大於x的時候就讓x減去步數;同樣的當x的坐標比-200小時,意味着箭頭到了左側邊界,那么不再讓x坐標減去步數v,而是讓x坐標增加。
關於事件
在scratch中事件是很常用的功能,比如當鼠標被單擊的時候,角色說話:

其實小烏龜也是可以的,不過呢這里要用到函數的功能,不知道各位看官在Scratch里有沒有學習函數的功能呢,這里要介紹python里面函數的語法
def function_name():
pass
可以看到,首先要有def關鍵字,然后空一格,然后是函數名,括號以及冒號,冒號是必不可少的內容!
from turtle import *
shape('turtle')
def sayhello(x, y):
write('2007-2017高考十年')
onclick(sayhello)

運行上述代碼,會發現當你單擊小烏龜的時候,小烏龜會說出我們指定的話語,'2007-2017高考十年',有沒有很唏噓。
這里需要注意但是函數sayhello有兩個參數x,y分別代表小烏龜當前的橫縱坐標。同時onclick函數的參數,是一個函數名,這里面涉及到了回調,當然我們知道怎么一回事就可以了,當你希望被單擊的時候執行那個函數對應的功能呢,你就在onclick的參數里面寫上這個函數就可以了。
關於動作積木塊的類比
| - | - | - |
|---|---|---|
| Scratch代碼塊 | Python命令 | 作用 |
![]() |
setx() |
設定x坐標 |
![]() |
sety() |
設定y坐標 |
![]() |
xcor();ycor() |
獲取xy坐標 |






