您好,登錄后才能下訂單哦!
今天小編給大家分享一下怎么用Python代碼實現模擬動態指針時鐘的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
桌面時鐘項目描述
1、使用turtle庫繪制時鐘外形及表針;
2、使用datetime獲取系統時間;
3、時鐘動態顯示
turtle庫基本命令
1、turtle.setup()函數:用于啟動一個圖形窗口,它有四個參數turtle.setup(width, height, startx, starty)分別是:啟動窗口的寬度和高度表示窗口啟動時,窗口左上角在屏幕中的坐標位置。
2、turtle.pensize()函數:表示小烏龜運動軌跡的寬度。
3、turtle.pencolor()函數:表示小烏龜運動軌跡的顏色。它包含一個輸入參數,這里我們把它設為藍色,blue,其他顏色單詞也可以使用。Turtle采用RGB方式來定義顏色,如果希望獲得和圖片中顏色一致的小蛇,請輸入turtle.pencolor(“#3B9909”)
4、turtle.seth(angle)函數:表示小烏龜啟動時運動的方向。它包含一個輸入參數,是角度值。0表示向東,90度向北,180度向西,270度向南;負值表示相反方向。程序中,我們讓小烏龜向-40度啟動爬行,即:向東南方向40度。
5、turtle.circle()函數:讓小烏龜沿著一個圓形爬行,參數rad描述圓形軌跡半徑的位置,這個半徑在小烏龜運行的左側,rad遠位置處。如果 rad為負值,則半徑在小烏龜運行的右側, 參數angle表示小烏龜沿著圓形爬行的弧度值。
6、turtle.fd()函數:表示烏龜向前直線爬行移動表示小烏龜向前直線爬行移動,它有一個參數表示爬行的距離
datetime模塊函數
1.datetime.date:表示日期的類,返回year-month-day
2.datetime.datetime:表示日期時間的類,返回年月日,時分秒
3.datetime.time:表示時間的類,
4.datetime.timedelta:表示時間間隔,即兩個時間點的間隔
5.datetime.tzinfo:時區的相關信息
python代碼示例
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 skip(-20) # 復原小時刻度的位置 else: turtle.pensize(1) # 將畫筆大小設置為1 turtle.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, printer turtle.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() # 不關閉窗體
運行結果:
表盤圖大家可以自己找一個,添加到位圖資源里就行。
添加了一個定時器,實現指針轉動更新
時針、分針、秒針的計算公式:
首先換算成12小時制,h = h % 12
時針每小時相當于于相對于y軸順時針30度。每分鐘0.5度(秒可以忽略)
分針每分鐘是6度,秒是0.1度
秒針每秒也是6度。
定義分針秒針時針的長度,按照秒針最長,時針次之,時針最短自己定義下。
然后有了指針的夾角,和長度,就可以得到指針末端的坐標,從時鐘中心用LineTo方法畫線即可。
MFC代碼示例
void CdrawdateDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 UpdateData(TRUE); CTime time = CTime::GetCurrentTime(); //獲得系統時間 m_Sec = time.GetSecond(); m_Min = time.GetMinute(); m_Hour = time.GetHour(); CDC* pDC = GetDC(); CRect rect; GetClientRect(&rect); //獲取客戶區域 CBitmap bitmap; //定義圖片類 bitmap.LoadBitmap(IDB_BITMAP2); //加載位圖 CDC memdc; //定義臨時畫布 memdc.CreateCompatibleDC(pDC); //創建畫布 memdc.SelectObject(&bitmap); //關聯圖片 int x = rect.Width() / 2; int y = rect.Height() / 2; //memdc.DrawText(weekDay(time), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); // 顯示星期 CString csCurrTime; csCurrTime.Format("%04d-%02d-%02d %s", time.GetYear(), time.GetMonth(), time.GetDay(), weekDay(time)); memdc.DrawText(csCurrTime, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); // 顯示當前日期 CPen MinutePen(PS_SOLID, 5, RGB(0, 0, 0)); //設置分針畫筆 memdc.SelectObject(&MinutePen); memdc.MoveTo(x, y); //繪制分針 memdc.LineTo(x + (long)100 * cos(PI / 2 - 2 * PI*m_Min / 60.0), y - (long)100 * sin(PI / 2 - 2 * PI*m_Min / 60.0)); CPen HourPen(PS_SOLID, 8, RGB(0, 0, 0)); //設置時針畫筆 memdc.SelectObject(&HourPen); memdc.MoveTo(x, y); //繪制時針 memdc.LineTo(x + (long)60 * cos(PI / 2 - 2 * PI*(5 * m_Hour / 60.0 + m_Min / 12.0 / 60.0)) , y - (long)60 * sin(PI / 2 - 2 * PI*(5 * m_Hour / 60.0 + m_Min / 12.0 / 60.0))); CPen SecondPen(PS_SOLID, 2, RGB(255, 0, 0)); //設置秒針畫筆 memdc.SelectObject(&SecondPen); memdc.MoveTo(x, y); memdc.LineTo(x + (long)140 * cos(PI / 2 - 2 * PI*m_Sec / 60.0), y - (long)140 * sin(PI / 2 - 2 * PI*m_Sec / 60.0));//繪制秒針 memdc.MoveTo(x, y); memdc.LineTo(x + (long)10 * cos(PI / 2 - 2 * PI*(m_Sec + 30) / 60.0), y - (long)10 * sin(PI / 2 - 2 * PI*(m_Sec + 30) / 60.0));//繪制秒針 SecondPen.DeleteObject(); MinutePen.DeleteObject(); HourPen.DeleteObject(); pDC->BitBlt(0, 0, rect.right, rect.bottom, &memdc, 0, 0, SRCCOPY); //復制圖片 memdc.DeleteDC(); //復制臨時畫布到預覽窗口 bitmap.DeleteObject(); //刪除圖片 ReleaseDC(pDC); CDialogEx::OnTimer(nIDEvent); }
輸出cstring(判斷今天星期幾)
CString CdrawdateDlg::weekDay(CTime oTime) { CString str; int nDayOfWeek = oTime.GetDayOfWeek(); switch (nDayOfWeek) { case 1: str = "星期日"; break; case 2: str = "星期一"; break; case 3: str = "星期二"; break; case 4: str = "星期三"; break; case 5: str = "星期四"; break; case 6: str = "星期五"; break; case 7: str = "星期六"; break; } return str; }
以上就是“怎么用Python代碼實現模擬動態指針時鐘”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。