Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan kod Python untuk mensimulasikan jam analog dinamik

Cara menggunakan kod Python untuk mensimulasikan jam analog dinamik

WBOY
WBOYke hadapan
2023-05-19 21:16:492704semak imbas

1. Pengenalan ringkas kepada pelaksanaan kod python dan perpustakaan penyu

Penerangan projek jam desktop

1. Gunakan perpustakaan penyu untuk melukis bentuk jam dan tangan; >2. Gunakan datetime Dapatkan masa sistem; tetingkap grafik, yang mempunyai empat Dua parameter turtle.setup(lebar, tinggi, startx, starty) adalah masing-masing: lebar dan tinggi tetingkap permulaan mewakili kedudukan koordinat sudut kiri atas tetingkap pada skrin apabila tingkap dimulakan.

2. fungsi penyu.pensize(): mewakili lebar trajektori pergerakan penyu.

Warna trajektori pergerakan penyu boleh ditetapkan dengan memanggil fungsi turtle.pencolor(). Fungsi ini mengambil parameter input, yang boleh kita tetapkan kepada biru, atau menggunakan perkataan warna lain. Penyu menggunakan RGB untuk mentakrifkan warna Jika anda ingin mendapatkan ular dengan warna yang sama seperti gambar, sila masukkan penyu.pencolor("#3B9909")

Arah pergerakan penyu apabila ia bermula boleh menjadi dipanggil penyu.seth (sudut) berfungsi untuk menetapkan. Ia mengandungi satu parameter input, iaitu nilai sudut. Arah boleh dinyatakan sebagai sudut: 0 darjah mewakili timur, 90 darjah mewakili utara, 180 darjah mewakili barat, dan 270 darjah mewakili nilai negatif mewakili arah yang bertentangan. Kami membiarkan penyu kecil mula merangkak pada sudut -40 darjah, iaitu, ke arah tenggara.

5. Fungsi Turtle.circle(): Biarkan penyu kecil merangkak di sepanjang bulatan. rad jauh. Apabila rad ialah nombor negatif, jejari terletak di sebelah kanan laluan larian penyu, dan sudut parameter mewakili lengkok penyu yang merangkak pada trajektori bulatan.

6. Fungsi Turtle.fd(): Menunjukkan bahawa penyu merangkak ke hadapan dalam garis lurus Menunjukkan bahawa penyu merangkak ke hadapan dalam garisan lurus

fungsi modul datetime

1.datetime.date: Kelas yang mewakili tarikh, mengembalikan tahun-bulan-hari

2.datetime.datetime: Kelas yang mewakili tarikh dan masa, mengembalikan tahun , bulan, hari, jam, minit dan saat

3.datetime.time: kelas yang mewakili masa,

4.datetime.timedelta: mewakili selang masa, iaitu selang antara dua titik masa

5.datetime.tzinfo: zon waktu Maklumat berkaitan

Contoh kod 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()            # 不关闭窗体

Hasil berjalan:

2. Pelaksanaan kod MFC

Anda boleh cari sendiri dan tambahkannya pada sumber bitmap.

Cara menggunakan kod Python untuk mensimulasikan jam analog dinamik

Menambah pemasa untuk melaksanakan kemas kini putaran penunjuk

Cara menggunakan kod Python untuk mensimulasikan jam analog dinamikpengiraan jarum jam, jarum minit, saat Formula tangan:

Pertama tukar kepada format 12 jam, h = h % 12

Cara menggunakan kod Python untuk mensimulasikan jam analog dinamikJam jam bersamaan dengan 30 darjah mengikut arah jam berbanding paksi-y. 0.5 darjah seminit (saat boleh diabaikan)

Jarum minit ialah 6 darjah seminit, dan yang kedua ialah 0.1 darjahJarum kedua juga 6 darjah sesaat.

Tentukan panjang jarum minit, jarum detik dan jarum jam Takrifkan mengikut panjang jarum detik, jarum terpanjang, jarum detik jarum jam dan jarum jam terpendek.

Kemudian dengan sudut dan panjang penunjuk, anda boleh mendapatkan koordinat penghujung penunjuk, dan hanya gunakan kaedah LineTo untuk melukis garisan dari tengah jam.

Contoh kod 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 keluaran (tentukan hari dalam minggu hari ini)

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

Atas ialah kandungan terperinci Cara menggunakan kod Python untuk mensimulasikan jam analog dinamik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam