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