1. 거북이 라이브러리를 사용하여 시계 모양과 바늘을 그립니다.
3. . 동적 시계 표시
turtle 라이브러리 기본 명령
1. Turtle.setup() 함수: 그래픽 창을 시작하는 데 사용됩니다. 이 함수에는 4개의 매개변수 Turtle.setup(width, height, startx, starty)가 있습니다. 시작 창은 창 시작을 나타내며 화면에서 창의 왼쪽 상단 모서리의 좌표 위치를 나타냅니다.
2. Turtle.pensize() 함수: 거북이의 이동 궤적 너비를 나타냅니다.
거북이의 운동 궤적 색상은 Turtle.pencolor() 함수를 호출하여 설정할 수 있습니다. 이 함수는 파란색으로 설정하거나 다른 색상 단어를 사용할 수 있는 입력 매개변수를 사용합니다. 거북이는 RGB를 사용하여 색상을 정의합니다. 그림과 같은 색상의 뱀을 얻으려면 Turtle.pencolor("#3B9909")를 입력하세요
시작할 때 거북이의 이동 방향은 Turtle.seth라고 할 수 있습니다. (각도) 기능을 설정합니다. 여기에는 각도 값인 하나의 입력 매개변수가 포함됩니다. 방향은 각도로 표현될 수 있습니다. 0도는 동쪽, 90도는 북쪽, 180도는 서쪽, 270도는 남쪽을 나타냅니다. 작은 거북이가 -40도 각도, 즉 남동쪽으로 기어가도록 놔두었습니다.
5. Turtle.circle() 함수: 작은 거북이가 원을 따라 기어가도록 합니다. 매개변수 rad는 원형 궤적의 반경 위치를 설명합니다. 이 반경은 거북이가 달리는 위치의 왼쪽, rad 멀리 있습니다. . rad가 음수인 경우 반경은 거북이가 달리는 경로의 오른쪽에 있고 매개변수 각도는 원형 궤적을 따라 기어가는 거북이의 호를 나타냅니다.
6. Turtle.fd() 함수: 직선으로 앞으로 기어가는 거북이를 나타냅니다. 기어가는 거리를 나타내는 매개변수가 있습니다.
1. datetime.date: 날짜를 나타냅니다. 클래스, 연-월-일을 반환합니다
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() # 不关闭窗体Running 결과:
2. MFC 코드 구현
다이얼 이미지를 직접 찾아 비트맵 리소스에 추가할 수 있습니다. 포인터 회전을 업데이트하는 타이머를 추가했습니다시침, 분침, 초침 계산 공식:
먼저 12시간 형식으로 변환합니다. h = h % 12
Hour 시간당 손 이는 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 코드를 사용하여 동적 아날로그 시계를 시뮬레이션하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!