Maison  >  Article  >  développement back-end  >  Comment utiliser le code Python pour simuler une horloge analogique dynamique

Comment utiliser le code Python pour simuler une horloge analogique dynamique

WBOY
WBOYavant
2023-05-19 21:16:492702parcourir

1. Une brève introduction à l'implémentation du code Python et à la bibliothèque Turtle

Description du projet d'horloge de bureau

1. Utilisez la bibliothèque Turtle pour dessiner la forme et les aiguilles de l'horloge

2. . Affichage dynamique de l'horloge

Commandes de base de la bibliothèque Turtle

1. Fonction Turtle.setup() : utilisée pour démarrer une fenêtre graphique. Elle a quatre paramètres Turtle.setup(width, height, startx, starty) : la largeur et la hauteur de. la fenêtre de démarrage indique le démarrage de la fenêtre, la position des coordonnées du coin supérieur gauche de la fenêtre sur l'écran.

2. Fonction Turtle.pensize() : représente la largeur de la trajectoire de mouvement de la tortue.

La couleur de la trajectoire de mouvement de la tortue peut être définie en appelant la fonction tortue.pencolor(). Cette fonction prend un paramètre d'entrée, que nous pouvons définir sur bleu, ou utiliser un autre mot de couleur. La tortue utilise RVB pour définir les couleurs. Si vous souhaitez obtenir un serpent de la même couleur que l'image, veuillez saisir tortue.pencolor("#3B9909")

La direction du mouvement de la tortue lorsqu'elle démarre peut être appelée tortue.seth. (angle) à régler. Il contient un paramètre d'entrée, qui est la valeur de l'angle. La direction peut être exprimée sous forme d'angle : 0 degrés représente l'est, 90 degrés représente le nord, 180 degrés représente l'ouest et 270 degrés représente le sud ; les valeurs négatives représentent la direction opposée. Nous laissons la petite tortue commencer à ramper selon un angle de -40 degrés, c'est-à-dire vers le sud-est.

5. Fonction Turtle.circle() : Laissez la petite tortue ramper le long d'un cercle. Le paramètre rad décrit la position du rayon de la trajectoire circulaire. Ce rayon est sur le côté gauche de la position de course de la tortue, rad loin. . Lorsque rad est un nombre négatif, le rayon se trouve sur le côté droit de la trajectoire de course de la tortue et le paramètre angle représente l'arc de la tortue rampant sur la trajectoire circulaire.

6. Fonction Turtle.fd() : signifie que la tortue avance en ligne droite. Cela signifie que la tortue avance en ligne droite. Elle a un paramètre qui représente la distance de rampement

.

1.datetime.date : représente la classe de date, renvoie l'année-mois-jour

2.datetime.datetime : classe représentant la date et l'heure, renvoie l'année, le mois, le jour, les heures, les minutes et les secondes

3.datetime. time : Classe représentant l'heure,

4.datetime.timedelta : Indique l'intervalle de temps, c'est-à-dire l'intervalle entre deux points temporels

5.datetime.tzinfo : Informations relatives au fuseau horaire

Exemple de code 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()            # 不关闭窗体
Résultats d'exécution :

2. Implémentation du code MFCComment utiliser le code Python pour simuler une horloge analogique dynamique

Vous pouvez trouver vous-même une image de cadran et l'ajouter aux ressources bitmap.

Ajout d'une minuterie pour mettre à jour la rotation du pointeurComment utiliser le code Python pour simuler une horloge analogique dynamique

Comment utiliser le code Python pour simuler une horloge analogique dynamiqueFormule de calcul de l'aiguille des heures, de l'aiguille des minutes, de l'aiguille des secondes :

Première conversion au format 12 heures, h = h % 12

Heure aiguille par heure Cela équivaut à 30 degrés dans le sens des aiguilles d'une montre par rapport à l'axe y. 0,5 degrés par minute (les secondes peuvent être ignorées)

L'aiguille des minutes est de 6 degrés par minute et la seconde est de 0,1 degrés

La trotteuse est également de 6 degrés par seconde.

Définissez la longueur de l'aiguille des minutes, de l'aiguille des secondes et de l'aiguille des heures. Définissez-la en fonction de la longueur de l'aiguille des secondes, de l'aiguille la plus longue, de l'aiguille des secondes et de l'aiguille des heures la plus courte.

Ensuite, avec l'angle et la longueur du pointeur, vous pouvez obtenir les coordonnées de l'extrémité du pointeur, et utiliser simplement la méthode LineTo pour tracer une ligne à partir du centre de l'horloge.

Exemple de code 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);
}
Sortie cstring (déterminer quel jour nous sommes aujourd'hui)

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;
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer