利用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)分別是:啟動窗口的寬度和高度表示窗口啟動時,窗口左上角在屏幕中的坐標位置。
2、turtle.pensize()函數(shù):表示小烏龜運動軌跡的寬度。
3、turtle.pencolor()函數(shù):表示小烏龜運動軌跡的顏色。它包含一個輸入?yún)?shù),這里我們把它設為藍色,blue,其他顏色單詞也可以使用。Turtle采用RGB方式來定義顏色,如果希望獲得和圖片中顏色一致的小蛇,請輸入turtle.pencolor(“#3B9909”)
4、turtle.seth(angle)函數(shù):表示小烏龜啟動時運動的方向。它包含一個輸入?yún)?shù),是角度值。0表示向東,90度向北,180度向西,270度向南;負值表示相反方向。程序中,我們讓小烏龜向-40度啟動爬行,即:向東南方向40度。
5、turtle.circle()函數(shù):讓小烏龜沿著一個圓形爬行,參數(shù)rad描述圓形軌跡半徑的位置,這個半徑在小烏龜運行的左側,rad遠位置處。如果 rad為負值,則半徑在小烏龜運行的右側, 參數(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ū)的相關信息
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): # 循環(huán)執(zhí)行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): # 創(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) # 設置形狀拉伸大小和輪廓線
hand.speed(0) # 設置速度為最快
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) # 設置秒針的角度
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) # 創(chuàng)建窗體大小
init_pointer() # 調用初始化指針的方法
turtle.tracer(False) # 關閉繪畫效果
draw_clock_dial() # 繪制表盤
move_pointer() # 調用移動指針的方法
turtle.mainloop() # 不關閉窗體
運行結果:

二、MFC代碼實現(xiàn)
表盤圖大家可以自己找一個,添加到位圖資源里就行。

添加了一個定時器,實現(xiàn)指針轉動更新

時針、分針、秒針的計算公式:
首先換算成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(); //獲得系統(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); //關聯(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); // 顯示當前日期
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代碼實現(xiàn)模擬動態(tài)指針時鐘的文章就介紹到這了,更多相關Python動態(tài)指針時鐘內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python函數(shù)__new__及__init__作用及區(qū)別解析
這篇文章主要介紹了Python函數(shù)__new__及__init__作用及區(qū)別解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
python中從str中提取元素到list以及將list轉換為str的方法
今天小編就為大家分享一篇python中從str中提取元素到list以及將list轉換為str的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python基于回溯法子集樹模板解決旅行商問題(TSP)實例
這篇文章主要介紹了Python基于回溯法子集樹模板解決旅行商問題(TSP),簡單描述了旅行商問題并結合實例形式分析了Python使用回溯法子集樹模板解決旅行商問題的相關實現(xiàn)步驟與操作技巧,需要的朋友可以參考下2017-09-09
Biblibili視頻投稿接口分析并以Python實現(xiàn)自動投稿功能
這篇文章主要介紹了Biblibili視頻投稿接口分析并以Python實現(xiàn)自動投稿功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02

