Python-使用海龟绘图制作动态时钟
在實現動態時鐘時,需要使用python內置的datetime模塊與turtle模塊。
1.datetime模塊
(1)datetime模塊中datetime類的today()方法,用于返回一個表示當前本地日期時間的datetime對象。
datetime.today()參數說明:
- 返回值:返回一個表示當前本地日期時間的datetime對象。
實現獲取當前本地日期與時間的示例代碼如下:
from datetime import datetime # 導入datetime模塊中的datetime類 dt=datetime.today() #把獲取的當前本地日期時間賦給變量dt print(dt) # 打印當前本地日期時間輸出結果為:
2019-10-11 09:18:35.784341(2)如果已經獲取了當前本地日期時間的datetime對象,此時可以通過該對象的變量名稱獲取對應的年、月、日、時、分、秒及微秒。
from datetime import datetime # 導入datetime模塊中的datetime類 dt=datetime.today() #把獲取的當前本地日期時間賦給變量dt print(dt) # 打印當前本地日期時間 print(dt.year,'年') print(dt.month,'月') print(dt.day,'日') print(dt.hour,'時') print(dt.minute,'分') print(dt.second,'秒') print(dt.microsecond,'微秒')輸出結果為:
2019-10-11 09:25:35.665185 2019 年 10 月 11 日 9 時 25 分 35 秒 665185 微秒(3)datetime對象中提供了weekday()方法,用于返回指定日期在一周內的序號,即星期幾,其中周一表示為0,周日表示為6。:
datetime.weekday()參數說明:
- 返回值:返回指定日期在一周內的序號,即星期幾,其中周一表示為0,周日表示為6。
實現獲取當前本地日期對應星期的示例代碼如下:
from datetime import datetime # 導入datetime模塊中的datetime類 week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'] dt=datetime.today() #把獲取的當前本地日期時間賦給變量dt print('當前日期時間為:',dt) print(week[dt.weekday()])輸出結果為:
當前日期時間為: 2019-10-11 09:46:34.851536 星期五2.turtle模塊
turtle模塊是python的內置模塊,所以在使用前需要使用import導入該模塊。
(1)創建游戲窗體可以使用turtle模塊中的setup()方法來實現。
turtle.setup(width=_CFG["width"],height=_CFG["height"],startx=_CFG["leftright"],starty=_CFG["topbottom"])參數說明如下:
- width:表示窗體的寬度,如果是整數,大小以像素為單位,如果是浮動,則為屏幕的一小部分;默認值為屏幕的50%。
- height:表示窗體的高度,如果是整數,高度以像素為單位,如果是浮動,則為屏幕的一小部分;默認值為屏幕的75%。
- startx:表示窗體顯示在屏幕的橫向位置,如果為正,則以像素為單位從屏幕左邊緣開始,如果為負,則從右邊緣開始,如果沒有,則水平居中窗口。
- starty:表示窗體顯示在屏幕的縱向位置,如果為正,則以像素為單位從屏幕上邊緣開始,如果為負,則從下邊緣開始,如果沒有,則垂直居中窗口。
創建游戲窗體的關鍵代碼如下:
import turtle # 導入繪圖海龜模塊 turtle.setup(450,450) # 創建窗體大小 turtle.mainloop() # 不關閉窗體(2)turtle模塊中的forward()方法,用于實現畫筆按照指定方向,移動指定的距離。
turtle.forward(distance)參數說明如下:
distance:表示需要指定的移動距離(整數或浮點數)。說明:turtle模塊中的fd()方法與forward()方法相同。實現移動繪制的示例代碼如下:
import turtle # 導入繪圖海龜模塊 turtle.forward(50) # 默認方向移動50,并繪制直線 turtle.mainloop() # 不關閉窗體說明:如果僅需要讓畫筆移動并不進行繪制時,可以在forward()方法前添加抬筆方法penup()、pu()或up()。(3)turtle模塊中的forward()方法,用于實現繪制指定直徑的點,可設置點的顏色。
turtle.dot(size=None,*color)參數說明如下:
- size:表示設置圓點直徑的大小。
- color:表示設置圓點的顏色,該值為字符串類型。
實現繪制圓點的示例代碼如下:
import turtle # 導入繪圖海龜模塊 def skip(distance): # 移動方法,不留移動痕跡turtle.penup() # 抬筆不繪制turtle.forward(distance) # 移動指定距離turtle.pendown() # 落筆移動繪制 if __name__ == '__main__':turtle.hideturtle() # 隱藏箭頭turtle.dot() # 默認值圓點skip(20) # 向前移動20turtle.dot(10) # 指定大小的圓點skip(20) # 向前移動20turtle.dot(15,'red') # 紅色圓點turtle.mainloop() # 不關閉窗體(4)turtle模塊中的right()方法,用于實現向右旋轉畫筆的角度。
turtle.right(angle)參數說明如下:
- angle:表示設置需要旋轉的角度。
實現旋轉繪制的示例代碼如下:
import turtle # 導入繪圖海龜模塊 def skip(distance): # 移動方法,不留移動痕跡turtle.penup() # 抬筆不繪制turtle.forward(distance) # 移動指定距離turtle.pendown() # 落筆移動繪制 if __name__ == '__main__':turtle.hideturtle() # 隱藏箭頭for i in range(60):skip(160) # 移動160turtle.dot(15,'red') # 紅色圓點skip(-160)turtle.right(6)(5)turtle模塊中的register_shape()方法,用于注冊圖形。
turtle.register_shape(name,shape=None)參數說明如下:
- name:表示注冊圖形的字符串名稱。
- shape:表示數據結構的建模形狀,可以是多邊形的坐標元組、圖片以及復合形狀。
實現注冊圖形的示例代碼如下:
import turtle # 導入繪圖海龜模塊 turtle.begin_poly() # 開始記錄行走位置 for i in range(2):turtle.forward(100) # 向前移動100turtle.left(90) # 向左旋轉90度turtle.forward(20) # 向前移動20turtle.left(90) # 向左旋轉90度turtle.end_poly() # 結束記錄行走位置turtle.register_shape("rectangle", turtle.get_poly())turtle.mainloop() # 不關閉窗體(6)turtle模塊中的shape()方法,用于將畫筆設置為指定圖形。
turtle.shape(name=None)參數說明如下:
name:表示需要設置圖形的字符串名稱。實現將畫筆設置為烏龜的示例代碼如下:
import turtle # 導入繪圖海龜模塊 turtle.shape('turtle') # 將畫筆設置為烏龜 turtle.mainloop() # 不關閉窗體實例
''' 動態時鐘 ''' import turtle # 導入繪圖海龜模塊 import datetime # 導入日期時間模塊# 移動一段距離 def skip(distance): # 移動方法,不留移動痕跡turtle.penup() # 抬筆不繪制turtle.forward(distance) # 移動指定距離turtle.pendown() # 落筆移動繪制def draw_clock_dial(): # 繪制表盤的方法turtle.reset() # 刪除圖形歸位turtle.hideturtle() # 隱藏箭頭for i in range(60): # 循環執行60次,一圈為360度所以每一秒的角度為6度skip(160) # 移動160,相當于表盤圓的半徑# 每5秒繪制一個小時刻度if i % 5 == 0:turtle.pensize(7) # 刻度大小# 畫時鐘turtle.forward(20) # 小時刻度的長度為20# if i == 0: # 判斷第一個位置為12點# # 寫入數字12# turtle.write(12, align='center', font=('Courier', 14, 'bold'))# elif i == 25 or i == 30 or i == 35: # 5、6、7# skip(25) # 避免與刻度重疊,所以多移動一段距離# # 根據i除以5獲取,5點、6點、7點并寫入對應的數字# turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))# skip(-25) # 回到原位置# else:# # 根據i除以5獲取其它時間的數字并寫入# turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))skip(-20) # 復原小時刻度的位置else:turtle.pensize(1) # 將畫筆大小設置為1turtle.dot() # 繪制分鐘刻度的小圓點skip(-160) # 回到中心位置turtle.right(6) # 向右旋轉6度def get_week(t): # 獲取星期的方法week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']return week[t.weekday()] # 返回當天的星期def create_pointer(length, name): # 創建指針方法turtle.reset() # 刪除圖形歸位skip(-length * 0.1) # 抬筆移動指定距離turtle.begin_poly() # 記錄多邊形turtle.forward(length * 1.1) # 繪制指定長度的指針turtle.end_poly() # 停止記錄多邊形# 注冊多邊形狀turtle.register_shape(name, turtle.get_poly())def init_pointer(): # 初始化指針global secHand, minHand, hurHand, printerturtle.mode("logo") # 重置Turtle指向上create_pointer(135,"secHand") # 創建秒針圖形create_pointer(110,"minHand") # 創建分針圖形create_pointer(90,"hurHand") # 創建時針圖形secHand = turtle.Turtle() # 創建秒針turtle對象secHand.shape("secHand") # 創建指定秒針名稱的形狀minHand = turtle.Turtle() # 創建分針turtle對象minHand.shape("minHand") # 創建指定分針名稱的形狀hurHand = turtle.Turtle() # 創建時針turtle對象hurHand.shape("hurHand") # 創建指定時針名稱的形狀for hand in secHand, minHand, hurHand: # 循環遍歷三個指針hand.shapesize(1, 1, 5) # 設置形狀拉伸大小和輪廓線hand.speed(0) # 設置速度為最快printer = turtle.Turtle() # 創建繪制文字的Turtle對象printer.hideturtle() # 隱藏箭頭printer.penup() # 抬筆def move_pointer(): # 移動指針的方法# 不停的獲取時間t = datetime.datetime.today()second = t.second + t.microsecond * 0.000001 # 計算移動的秒minute = t.minute + second/60 # 計算移動的分hour = t.hour + minute/60 # 計算移動的小時secHand.setheading(6*second) # 設置秒針的角度minHand.setheading(6*minute) # 設置分針的角度hurHand.setheading(30*hour) # 設置時針的角度turtle.tracer(False) # 關閉繪畫效果printer.forward(65) # 向上移動65# 繪制星期printer.write(get_week(t), align="center",font=("Courier", 14, "bold"))printer.back(130) # 倒退130# 繪制年月日printer.write(t.strftime('%Y-%m-%d'), align="center",font=("Courier", 14, "bold"))printer.home() # 歸位turtle.tracer(True) # 開啟繪畫效果turtle.ontimer(move_pointer, 10) # 10毫秒后調用move_pointer()方法if __name__ == '__main__':turtle.setup(450, 450) # 創建窗體大小init_pointer() # 調用初始化指針的方法turtle.tracer(False) # 關閉繪畫效果draw_clock_dial() # 繪制表盤move_pointer() # 調用移動指針的方法turtle.mainloop() # 不關閉窗體總結
以上是生活随笔為你收集整理的Python-使用海龟绘图制作动态时钟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三极管原理
- 下一篇: Python绘图Turtle库详解情人节