""" 改編自turtle.py自帶demo 執行 python -m turtledemo 命令查看系統內置demo的源碼 繪製:須要經過import turtle引入繪製圖形庫turtle庫 注意:1.全文中的 turtle.xxx()中的turtle本質是該海龜屏幕上默認的海龜實例對象,他等價於turtle.getturtle()返回的對象實例.即任何turtle.xxx()函數均可以寫成turtle.getturtle.xxx() 2.屏幕正中心爲(0,0)點 """ import turtle import time def demo1(): # 恢復默認位置和默認方向,保留當前海龜箭頭圖標(此時就是普通箭頭) turtle.reset() turtle.tracer(True) # 畫筆擡起 turtle.pu() # 畫筆向後100像素 turtle.bk(100) # 畫筆放下 turtle.pd() # 設置畫筆線條粗細爲3,同turtle.width(3) turtle.pensize(3) # 繪製3個正方形; 填充最後一個(i 從 0 - 2循環3次) for i in range(3): print("當前i=", i) if i == 2: # 最後一個正方形開始填充 turtle.begin_fill() # 寫字標識當前再畫第幾個正方形 turtle.write(i + 1, False, align="right") # 畫正方形 draw_square(turtle.getturtle()) if i == 2: # 繪製完正方形後將pencolor和fillcolor設置成褐紅色 turtle.color("maroon") # 最後一個正方形結束填充 turtle.end_fill() # 每次畫完正方形畫筆擡起,而後向前移動30像素再放下 turtle.pu() turtle.fd(30) turtle.pd() # 設置畫筆線條粗細爲1,同turtle.width(1) turtle.pensize(1) # 將pencolor和fillcolor設置成黑色 turtle.color("black") # move out of the way turtle.tracer(False) # 畫筆擡起 turtle.pu() # 右轉90度此時方向向下 turtle.rt(90) # 向前(即向下)移動100像素 turtle.fd(100) # 右轉90度此時方向向左 turtle.rt(90) # 向前(即向左)移動100像素 turtle.fd(100) # 右轉180度此時方向向右 turtle.rt(180) # 畫筆放下 turtle.pd() # 繪製一些文本 turtle.write("畫樓梯", True) turtle.write("start", True) # 將pencolor和fillcolor設置成紅色 turtle.color("red") # 畫5個樓梯(從0-4遍歷),最後heading()爲0.0表示方向向右 for i in range(5): turtle.fd(20) turtle.lt(90) turtle.fd(20) turtle.rt(90) turtle.tracer(True) # 繪製5個填充的樓梯 turtle.begin_fill() for i in range(5): turtle.fd(20) turtle.lt(90) turtle.fd(20) turtle.rt(90) # 完成填充,由於此時的fillcolor爲red紅色,因此以紅色進行填充 turtle.end_fill() # more text def switchpen(_turtle): """ 間斷效果 :param _turtle: 將被處理的turtle對象 """ if _turtle.isdown(): _turtle.pu() else: _turtle.pd() def draw_square(_turtle): """ 畫邊長20像素的正方形 :param _turtle: 將被處理的turtle對象 """ # 方法1 """ old = _turtle.heading() _turtle.setheading(315) _turtle.circle(15, None, 4) _turtle.setheading(old) """ # 方法2 for _ in range(4): _turtle.fd(20) _turtle.lt(90) def demo2(): """Demo of some new features.""" # 使用最慢速度 0最快,1-10逐漸加快 turtle.speed(1) # 隱藏畫筆(即海龜箭頭),同 turtle.hideturtle()。此時只要畫筆是按下狀態,雖然隱藏了可是仍是能繪製圖形的 #turtle.ht() # 顯示畫筆,同 turtle.showturtle() #turtle.st() # 設置畫筆線條粗細爲3,同turtle.width(3) turtle.pensize(3) # 設置海龜箭頭當前方向角度(當前模式下海龜箭頭當前位置指向(0,0)點的向量角度),turtle.towards(0, 0)實際上是當前方向的反方向 turtle.setheading(turtle.towards(0, 0)) # 計算半徑(海龜箭頭當前位置到(0,0)位置距離的一半) radius = turtle.distance(0, 0)/2.0 # 海龜箭頭右轉90度,即以海龜箭頭當前位置到(0,0)爲直徑畫 turtle.rt(90) # 畫18次角度爲10度的小段圓弧,畫筆每按下畫一小段就再擡起移動一小段 for _ in range(18): switchpen(turtle.getturtle()) turtle.circle(radius, 10) turtle.write("wait a moment...") # 等待2秒 time.sleep(2) # 撤銷全部 while turtle.undobufferentries(): turtle.undo() # 清屏並將畫筆位置和方向恢復到初始狀態並保持畫筆形狀不變,即位置到原點(0, 0),由於模式是"standard"方向恢復向右,"standard"/"world"模式方向也恢復到默認的向右,"logo"模式方向恢復到默認的向上 turtle.reset() # 海龜箭頭左轉90度 turtle.lt(90) turtle.colormode(255) # 定義等邊三角形默認的邊長 laenge = 10 turtle.pencolor("green") # 設置畫筆線條粗細爲3, 同turtle.width(3) turtle.pensize(3) # 海龜箭頭左轉180度 turtle.lt(180) # i爲-2 到15 共遍歷18次,之因此i有負數,是由於內循環中turtle.fillcolor(255-15*i, 0, 15*i)中的15*i不能超過255(即colormode的值) for i in range(-2, 16): print("當前i=", i) # 後15次畫的圖形進行填充,每次填充色不一樣 if i > 0: turtle.begin_fill() turtle.fillcolor(255-15*i, 0, 15*i) # 畫等邊三角形 for _ in range(3): turtle.fd(laenge) turtle.lt(120) # 後15次畫的圖形填充完畢 if i > 0: turtle.end_fill() # 每畫完一個等邊三角形,等邊三角形的變成增長10像素,而且角度左轉15度 laenge += 10 turtle.lt(15) # 達到 慢->快->慢->快 的效果 (速度值>10 則被置爲0即最快速度) turtle.speed((turtle.speed()+1) % 12) # 海龜箭頭左轉120度 turtle.lt(120) # 畫筆擡起 turtle.pu() # 向前移動70像素 turtle.fd(70) # 海龜箭頭向右轉30度 turtle.rt(30) # 畫筆放下 turtle.pd() # pencolor設置成紅色而且fillcolor設置成黃色 turtle.color("red", "yellow") # 速度設置成最快 turtle.speed(0) # 畫圖形並填充 turtle.begin_fill() for _ in range(4): # 繪製1/4圓 turtle.circle(50, 90) # 右轉90度 turtle.rt(90) # 前移30像素 turtle.fd(30) # 右轉90度 turtle.rt(90) # 圖形填充完畢 turtle.end_fill() # 海龜箭頭左轉90度 turtle.lt(90) # 畫筆擡起 turtle.pu() # 向前移動30像素 turtle.fd(30) # 畫筆放下 turtle.pd() # 海龜箭頭圖標設置成海龜 turtle.shape("turtle") # 獲取(默認的)第一個Turtle實例對象 tri = turtle.getturtle() # 下文中的 tri(默認的)第一個Turtle實例對象,能夠將全部的tri替換成turtle,好比tri.lt(100) 可改爲 turtle.lt(100) # 設置tri的(海龜箭頭和)畫筆大小的縮放模式爲auto,此模式下(海龜箭頭和)畫筆隨 pensize變化而變化. tri.resizemode("auto") # 建立一個新的Turtle實例對象並返回該對象實例 turtle1 = turtle.Turtle() # 設置turtle1的(海龜箭頭和)畫筆大小的縮放模式爲auto,此模式下(海龜箭頭和)畫筆隨 pensize變化而變化. turtle1.resizemode("auto") # turtle1的海龜箭頭圖標設置成海龜 turtle1.shape("turtle") turtle1.reset() turtle1.lt(90) # turtle1設置畫筆速度爲0最大速度 turtle1.speed(0) # turtle1的畫筆擡起 turtle1.pu() # turtle1的畫筆移動到座標點(280, 40) turtle1.goto(280, 40) # turtle1的左轉30度 turtle1.lt(30) # turtle1的畫筆放下 turtle1.pd() # turtle1設置畫筆速度爲6 turtle1.speed(6) # turtle1的pencolor設置成藍色而且fillcolor設置成橘黃色 turtle1.color("blue", "orange") # 設置畫筆線條粗細爲2, 同turtle.width(2) turtle1.pensize(2) # tri設置畫筆速度爲6 tri.speed(6) # tri方向指向turtle1當前位置 tri.setheading(tri.towards(turtle1)) count = 1 # 只要tri與turtle1之間距離>4像素進入循環 while tri.distance(turtle1) > 4: turtle1.fd(3.5) turtle1.lt(0.6) tri.setheading(tri.towards(turtle1)) tri.fd(4) if count % 20 == 0: # 當前位置拷貝一份turtle1實例的當前海龜箭頭圖標 turtle1.stamp() # 當前位置拷貝一份tri實例的當前海龜箭頭圖標 tri.stamp() # tri間斷效果 switchpen(tri) # turtle1間斷效果 #switchpen(turtle1) count += 1 tri.write("CAUGHT! ", font=("Arial", 16, "bold"), align="right") tri.pencolor("black") tri.pencolor("red") # 等待2秒 time.sleep(2) # 此處的turtle.undobufferentries()等價於turtle.getturtle().undobufferentries()或tri.undobufferentries()表示只要第一個turtle實例能夠撤銷,就一直撤銷,由於tri的操做數量相對於turtle1要多,爲了兩個對象都撤銷完因此用了前者 while turtle.undobufferentries(): # tri對象撤銷一步 tri.undo() # turtle1對象撤銷一步 turtle1.undo() # tri對象向前移動50像素 tri.fd(50) tri.write(" Click anywhere to exit!", font=("Courier", 12, "bold")) # 獲取海龜屏幕TurtleScreen對象實例 screen = turtle.getscreen() # 註冊點擊事件,點擊海龜屏幕TurtleScreen任何位置,觸發close_window函數 screen.onclick(close_window) def close_window(x, y): print("點擊位置(", x, ",", y, ")") # 獲取當前海龜屏幕TurtleScreen的對象實例 screen = turtle.getscreen() # 清屏 screen.clearscreen() # 關閉窗口 screen.bye() def my_main(): demo1() demo2() # 保持屏幕,直到點擊窗口右上角關閉按鈕或調用turtle.bye()方法 turtle.mainloop() if __name__ == '__main__': my_main()