>  기사  >  백엔드 개발  >  Python 코드를 사용하여 동적 아날로그 시계를 시뮬레이션하는 방법

Python 코드를 사용하여 동적 아날로그 시계를 시뮬레이션하는 방법

WBOY
WBOY앞으로
2023-05-19 21:16:492791검색

1. Python 코드 구현 및 거북이 라이브러리에 대한 간략한 소개

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 코드 구현

다이얼 이미지를 직접 찾아 비트맵 리소스에 추가할 수 있습니다.

Python 코드를 사용하여 동적 아날로그 시계를 시뮬레이션하는 방법

포인터 회전을 업데이트하는 타이머를 추가했습니다

Python 코드를 사용하여 동적 아날로그 시계를 시뮬레이션하는 방법

시침, 분침, 초침 계산 공식:

Python 코드를 사용하여 동적 아날로그 시계를 시뮬레이션하는 방법먼저 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제