Heim >Backend-Entwicklung >Python-Tutorial >So simulieren Sie mit Python-Code eine dynamische Analoguhr
1. Verwenden Sie die Turtle-Bibliothek, um die Uhrform und die Zeiger zu zeichnen.
3 . Dynamische Uhranzeige
Grundlegende Befehle der Turtle-Bibliothek
1. Funktion „Turtle.setup()“: Wird zum Starten eines Grafikfensters verwendet. Sie verfügt über vier Parameter „turtle.setup(width, height, startx, starty)“: die Breite und Höhe von Das Startfenster zeigt den Fensterstart an, die Koordinatenposition der oberen linken Ecke des Fensters auf dem Bildschirm.
2. Funktion „turtle.pensize()“: Stellt die Breite der Bewegungsbahn der Schildkröte dar.
Die Farbe der Bewegungsbahn der Schildkröte kann durch Aufrufen der Funktion Turtle.pencolor() eingestellt werden. Diese Funktion benötigt einen Eingabeparameter, den wir auf Blau setzen oder ein anderes Farbwort verwenden können. Turtle verwendet RGB, um Farben zu definieren. Wenn Sie eine Schlange mit der gleichen Farbe wie das Bild erhalten möchten, geben Sie bitte Turtle.pencolor("#3B9909") ein.
Die Bewegungsrichtung der Schildkröte beim Start kann Turtle.seth heißen (Winkel-)Funktion zum Einstellen. Es enthält einen Eingabeparameter, nämlich den Winkelwert. Die Richtung kann als Winkel ausgedrückt werden: 0 Grad steht für Osten, 90 Grad für Norden, 180 Grad für Westen und 270 Grad für die entgegengesetzte Richtung. Wir lassen die kleine Schildkröte in einem Winkel von -40 Grad, also in Richtung Südosten, anfangen zu kriechen.
5. Turtle.circle()-Funktion: Lassen Sie die kleine Schildkröte entlang eines Kreises kriechen. Der Parameter rad beschreibt die Position des Radius der kreisförmigen Flugbahn. Dieser Radius liegt auf der linken Seite der Laufposition der Schildkröte . Wenn rad eine negative Zahl ist, befindet sich der Radius auf der rechten Seite der Laufbahn der Schildkröte und der Parameter Winkel stellt den Bogen dar, in dem die Schildkröte auf der kreisförmigen Flugbahn kriecht.
6. Turtle.fd()-Funktion: bedeutet, dass die Schildkröte in einer geraden Linie vorwärts kriecht. Sie hat einen Parameter, der die Kriechstrecke darstellt
1.datetime.date: stellt die Datumsklasse dar, gibt Jahr-Monat-Tag zurück2.datetime.datetime: Klasse, die Datum und Uhrzeit darstellt, gibt Jahr, Monat, Tag, Stunden, Minuten und Sekunden zurück3.datetime. time: Klasse, die Zeit darstellt, 4.datetime.timedelta: Gibt das Zeitintervall an, dLaufende Ergebnisse:
2. MFC-Code-Implementierung
Sie können selbst ein Zifferblattbild finden und es den Bitmap-Ressourcen hinzufügen.
Einen Timer hinzugefügt, um die Zeigerdrehung zu aktualisieren
Berechnungsformel für Stundenzeiger, Minutenzeiger, Sekundenzeiger:
Erste Konvertierung in das 12-Stunden-Format, h = h % 12Stunde Zeiger pro Stunde Dies entspricht 30 Grad im Uhrzeigersinn relativ zur y-Achse. 0,5 Grad pro Minute (Sekunden können ignoriert werden)Der Minutenzeiger zeigt 6 Grad pro Minute und der Sekundenzeiger 0,1 Grad.
Der Sekundenzeiger zeigt ebenfalls 6 Grad pro Sekunde.
Definieren Sie die Länge des Minutenzeigers, des Sekundenzeigers und des Stundenzeigers entsprechend der Länge des Sekundenzeigers, des längsten Zeigers, des Sekundenzeigers und des kürzesten Stundenzeigers.
Anhand des Winkels und der Länge des Zeigers können Sie dann die Koordinaten des Endes des Zeigers ermitteln und einfach mit der LineTo-Methode eine Linie von der Mitte der Uhr zeichnen.MFC-Codebeispiel
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() # 不关闭窗体
Ausgabe-Cstring (bestimmen Sie, welcher Tag heute ist)
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); }
Das obige ist der detaillierte Inhalt vonSo simulieren Sie mit Python-Code eine dynamische Analoguhr. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!