利用Python代碼實現(xiàn)模擬動態(tài)指針時鐘
一、python代碼實現(xiàn)及turtle庫簡單介紹
桌面時鐘項目描述
1、使用turtle庫繪制時鐘外形及表針;
2、使用datetime獲取系統(tǒng)時間;
3、時鐘動態(tài)顯示
turtle庫基本命令
1、turtle.setup()函數(shù):用于啟動一個圖形窗口,它有四個參數(shù)turtle.setup(width, height, startx, starty)分別是:啟動窗口的寬度和高度表示窗口啟動時,窗口左上角在屏幕中的坐標(biāo)位置。
2、turtle.pensize()函數(shù):表示小烏龜運動軌跡的寬度。
3、turtle.pencolor()函數(shù):表示小烏龜運動軌跡的顏色。它包含一個輸入?yún)?shù),這里我們把它設(shè)為藍(lán)色,blue,其他顏色單詞也可以使用。Turtle采用RGB方式來定義顏色,如果希望獲得和圖片中顏色一致的小蛇,請輸入turtle.pencolor(“#3B9909”)
4、turtle.seth(angle)函數(shù):表示小烏龜啟動時運動的方向。它包含一個輸入?yún)?shù),是角度值。0表示向東,90度向北,180度向西,270度向南;負(fù)值表示相反方向。程序中,我們讓小烏龜向-40度啟動爬行,即:向東南方向40度。
5、turtle.circle()函數(shù):讓小烏龜沿著一個圓形爬行,參數(shù)rad描述圓形軌跡半徑的位置,這個半徑在小烏龜運行的左側(cè),rad遠(yuǎn)位置處。如果 rad為負(fù)值,則半徑在小烏龜運行的右側(cè), 參數(shù)angle表示小烏龜沿著圓形爬行的弧度值。
6、turtle.fd()函數(shù):表示烏龜向前直線爬行移動表示小烏龜向前直線爬行移動,它有一個參數(shù)表示爬行的距離
datetime模塊函數(shù)
1.datetime.date:表示日期的類,返回year-month-day
2.datetime.datetime:表示日期時間的類,返回年月日,時分秒
3.datetime.time:表示時間的類,
4.datetime.timedelta:表示時間間隔,即兩個時間點的間隔
5.datetime.tzinfo:時區(qū)的相關(guān)信息
python代碼示例
import turtle # 導(dǎo)入繪圖海龜模塊 import datetime # 導(dǎo)入日期時間模塊 # 移動一段距離 def skip(distance): # 移動方法,不留移動痕跡 turtle.penup() # 抬筆不繪制 turtle.forward(distance) # 移動指定距離 turtle.pendown() # 落筆移動繪制 def draw_clock_dial(): # 繪制表盤的方法 turtle.reset() # 刪除圖形歸位 turtle.hideturtle() # 隱藏箭頭 for i in range(60): # 循環(huán)執(zhí)行60次,一圈為360度所以每一秒的角度為6度 skip(160) # 移動160,相當(dāng)于表盤圓的半徑 # 每5秒繪制一個小時刻度 if i % 5 == 0: turtle.pensize(7) # 刻度大小 # 畫時鐘 turtle.forward(20) # 小時刻度的長度為20 skip(-20) # 復(fù)原小時刻度的位置 else: turtle.pensize(1) # 將畫筆大小設(shè)置為1 turtle.dot() # 繪制分鐘刻度的小圓點 skip(-160) # 回到中心位置 turtle.right(6) # 向右旋轉(zhuǎn)6度 def get_week(t): # 獲取星期的方法 week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'] return week[t.weekday()] # 返回當(dāng)天的星期 def create_pointer(length, name): # 創(chuàng)建指針方法 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") # 創(chuàng)建秒針圖形 create_pointer(110,"minHand") # 創(chuàng)建分針圖形 create_pointer(90,"hurHand") # 創(chuàng)建時針圖形 secHand = turtle.Turtle() # 創(chuàng)建秒針turtle對象 secHand.shape("secHand") # 創(chuàng)建指定秒針名稱的形狀 minHand = turtle.Turtle() # 創(chuàng)建分針turtle對象 minHand.shape("minHand") # 創(chuàng)建指定分針名稱的形狀 hurHand = turtle.Turtle() # 創(chuàng)建時針turtle對象 hurHand.shape("hurHand") # 創(chuàng)建指定時針名稱的形狀 for hand in secHand, minHand, hurHand: # 循環(huán)遍歷三個指針 hand.shapesize(1, 1, 5) # 設(shè)置形狀拉伸大小和輪廓線 hand.speed(0) # 設(shè)置速度為最快 printer = turtle.Turtle() # 創(chuàng)建繪制文字的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) # 設(shè)置秒針的角度 minHand.setheading(6*minute) # 設(shè)置分針的角度 hurHand.setheading(30*hour) # 設(shè)置時針的角度 turtle.tracer(False) # 關(guān)閉繪畫效果 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毫秒后調(diào)用move_pointer()方法 if __name__ == '__main__': turtle.setup(450, 450) # 創(chuàng)建窗體大小 init_pointer() # 調(diào)用初始化指針的方法 turtle.tracer(False) # 關(guān)閉繪畫效果 draw_clock_dial() # 繪制表盤 move_pointer() # 調(diào)用移動指針的方法 turtle.mainloop() # 不關(guān)閉窗體
運行結(jié)果:
二、MFC代碼實現(xiàn)
表盤圖大家可以自己找一個,添加到位圖資源里就行。
添加了一個定時器,實現(xiàn)指針轉(zhuǎn)動更新
時針、分針、秒針的計算公式:
首先換算成12小時制,h = h % 12
時針每小時相當(dāng)于于相對于y軸順時針30度。每分鐘0.5度(秒可以忽略)
分針每分鐘是6度,秒是0.1度
秒針每秒也是6度。
定義分針秒針時針的長度,按照秒針最長,時針次之,時針最短自己定義下。
然后有了指針的夾角,和長度,就可以得到指針末端的坐標(biāo),從時鐘中心用LineTo方法畫線即可。
MFC代碼示例
void CdrawdateDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值 UpdateData(TRUE); CTime time = CTime::GetCurrentTime(); //獲得系統(tǒng)時間 m_Sec = time.GetSecond(); m_Min = time.GetMinute(); m_Hour = time.GetHour(); CDC* pDC = GetDC(); CRect rect; GetClientRect(&rect); //獲取客戶區(qū)域 CBitmap bitmap; //定義圖片類 bitmap.LoadBitmap(IDB_BITMAP2); //加載位圖 CDC memdc; //定義臨時畫布 memdc.CreateCompatibleDC(pDC); //創(chuàng)建畫布 memdc.SelectObject(&bitmap); //關(guān)聯(lián)圖片 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); // 顯示當(dāng)前日期 CPen MinutePen(PS_SOLID, 5, RGB(0, 0, 0)); //設(shè)置分針畫筆 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)); //設(shè)置時針畫筆 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)); //設(shè)置秒針畫筆 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); //復(fù)制圖片 memdc.DeleteDC(); //復(fù)制臨時畫布到預(yù)覽窗口 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; }
代碼運行結(jié)果:
到此這篇關(guān)于利用Python代碼實現(xiàn)模擬動態(tài)指針時鐘的文章就介紹到這了,更多相關(guān)Python動態(tài)指針時鐘內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python函數(shù)__new__及__init__作用及區(qū)別解析
這篇文章主要介紹了Python函數(shù)__new__及__init__作用及區(qū)別解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08python中從str中提取元素到list以及將list轉(zhuǎn)換為str的方法
今天小編就為大家分享一篇python中從str中提取元素到list以及將list轉(zhuǎn)換為str的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06pytorch fine-tune 預(yù)訓(xùn)練的模型操作
這篇文章主要介紹了pytorch fine-tune 預(yù)訓(xùn)練的模型操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Python基于回溯法子集樹模板解決旅行商問題(TSP)實例
這篇文章主要介紹了Python基于回溯法子集樹模板解決旅行商問題(TSP),簡單描述了旅行商問題并結(jié)合實例形式分析了Python使用回溯法子集樹模板解決旅行商問題的相關(guān)實現(xiàn)步驟與操作技巧,需要的朋友可以參考下2017-09-09Biblibili視頻投稿接口分析并以Python實現(xiàn)自動投稿功能
這篇文章主要介紹了Biblibili視頻投稿接口分析并以Python實現(xiàn)自動投稿功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02Python?Decorator的設(shè)計模式演繹過程解析
本文主要梳理了Python?decorator的實現(xiàn)思路,解釋了為什么Python?decorator是現(xiàn)在這個樣子,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07