Python Turtle 实现动态时钟:十二时辰与星空流星效果

news2024/12/14 22:53:13

        在这篇文章中,我将带你通过 Python 的 turtle 模块构建一个动态可视化时钟程序。这个时钟不仅具备传统的时间显示功能,还融合了中国古代的十二时辰八卦符号,并通过动态星空、流星效果与昼夜背景切换,为程序增添了观赏性和文化内涵。这是一次将现代编程技术与传统文化元素相结合的实践,非常适合提升编程技巧与创意表达。

项目介绍

我们将实现一个可视化的时钟,主要包含以下功能:

  1. 动态时钟指针:模拟现实中的时钟,具有秒针、分针、时针。
  2. 十二时辰与八卦符号展示:表盘上添加了中国传统的十二时辰与八卦符号,增强文化气息。
  3. 动态星空与流星:在夜晚模式下模拟星空和流星效果,增加动态视觉体验。
  4. 昼夜模式切换:自动判断当前时间,白天和夜晚显示不同背景色。
  5. 随机天气提示:结合当前时辰,给出随机的天气提示,提升趣味性。
  6. 版权信息展示:页面底部显示公司信息,增加程序的专业感。

核心代码解析

以下是项目中主要模块的详细解析:

1. 设置 Turtle 屏幕与标题

首先,通过 turtle 初始化主窗口,设置窗口大小、背景色及标题。

def setup_screen():
    turtle.setup(800, 1000)  # 窗口大小
    turtle.bgcolor("black")  # 初始背景为黑夜
    turtle.title("动态时钟与真实流星 + 星空 + 昼夜模式")
    turtle.tracer(0)  # 关闭自动刷新,提升性能
2. 绘制时钟表盘与刻度

使用 turtle 绘制标准的圆形表盘,并添加小时与分钟刻度。

def draw_clock_face():
    pen = turtle.Turtle()
    pen.speed(0)
    pen.hideturtle()
    pen.color("white")

    # 绘制外圆
    pen.penup()
    pen.goto(0, -200)
    pen.pendown()
    pen.circle(200)

    # 绘制刻度
    for i in range(60):
        pen.penup()
        pen.goto(0, 0)
        pen.setheading(-6 * i + 90)
        pen.forward(180)
        pen.pendown()
        if i % 5 == 0:  # 每5个刻度为大刻度
            pen.forward(20)
        else:
            pen.forward(10)
3. 添加十二时辰与八卦符号

将十二时辰和八卦符号分布在表盘周围,利用 setheading 精确定位文本位置。

shichen_mapping = [
    ('子', '胆经当令, 万籁俱静正好眠'),
    ...
]
bagua_symbols = ["乾", "兑", "离", "震", "巽", "坎", "艮", "坤"]

def draw_bagua_and_shichen():
    pen = turtle.Turtle()
    pen.hideturtle()
    pen.color("yellow")

    # 绘制十二时辰
    for i, (shichen, _) in enumerate(shichen_mapping):
        pen.penup()
        pen.goto(0, 0)
        pen.setheading(-30 * i + 90)
        pen.forward(260)
        pen.write(shichen, align="center", font=("Courier", 14, "bold"))

    # 绘制八卦符号
    pen.color("cyan")
    for i, symbol in enumerate(bagua_symbols):
        pen.penup()
        pen.goto(0, 0)
        pen.setheading(-45 * i + 90)
        pen.forward(220)
        pen.write(symbol, align="center", font=("Courier", 18, "bold"))
4. 绘制动态星空与流星

通过随机坐标绘制星星,流星的尾迹采用不同的亮度与宽度来实现渐变效果。

def draw_static_stars():
    star_pen.clear()
    star_pen.color("white")
    for _ in range(80):
        x = random.randint(-400, 400)
        y = random.randint(-400, 400)
        star_pen.penup()
        star_pen.goto(x, y)
        star_pen.pendown()
        star_pen.dot(random.randint(1, 3))


def draw_meteor():
    meteor_pen.clear()
    meteor_pen.penup()
    x_start = random.randint(-400, 400)
    y_start = random.randint(200, 400)
    x_end = x_start - random.randint(50, 150)
    y_end = y_start - random.randint(50, 150)

    meteor_pen.goto(x_start, y_start)
    meteor_pen.pendown()
    for i in range(10):
        brightness = 1.0 - (i / 10)
        meteor_pen.pencolor((brightness, brightness, brightness))
        meteor_pen.width(3 - i / 4)
        meteor_pen.goto(
            x_start - (x_start - x_end) * (i / 10),
            y_start - (y_start - y_end) * (i / 10)
        )
5. 动态时钟指针与时辰描述

每秒更新时钟状态,展示当前时辰描述与随机天气。

def update_clock(sec_hand, min_hand, hour_hand, label_pen):
    now = datetime.datetime.now()
    sec = now.second
    minute = now.minute + sec / 60
    hour = (now.hour % 12) + minute / 60

    # 更新指针角度
    sec_hand.setheading(-6 * sec + 90)
    min_hand.setheading(-6 * minute + 90)
    hour_hand.setheading(-30 * hour + 90)

    # 显示时辰信息
    label_pen.clear()
    shichen_index = (now.hour % 24) // 2
    info = shichen_mapping[shichen_index]
    label_pen.goto(0, -350)
    label_pen.write(f"当前时辰:{info[0]}时\n{info[1]}\n天气:{random.choice(['晴', '多云', '小雨'])}",
                    align="center", font=("Courier", 16, "bold"))
    draw_static_stars()
    draw_meteor()
    update_background()
    turtle.update()
    turtle.ontimer(lambda: update_clock(sec_hand, min_hand, hour_hand, label_pen), 1000)

总结

通过 turtle 库的巧妙运用,我们成功实现了一个融合动态时钟、星空、十二时辰和八卦符号的现代 Python 项目。这个程序不仅提升了编程技能,还将传统文化与技术进行了深度结合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

建筑电气火灾是怎么发生的?如何降低电气火灾风险?

电气火灾一直是建筑火灾的主要诱因,占总火灾比例的28.4%。传统的末端配电监控手段存在覆盖范围不足、反应时间滞后等问题,难以及时发现并应对潜在的电气安全隐患。本文提出了一种基于通讯模块、智能微断和智能终端的建筑末端配电解决方案,通过…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机(Finite State Machine, FSM)是一种用于建模系统行为的计算模型,它包含有限数量的状态,并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的,因此称…

Qt实现自定义行编辑器

引言 开发环境项目结构ui界面设计示例代码运行效果总结qt中原有的行编辑器无法满足当前的需要,所以需要自定义行编辑器。 通过上下按键切换到不同的行编辑器,在选中的行编辑器中输入数字,编辑器呈现边框,编辑后按下回车键保存之前编辑的数值,没有按下回车键直接切换上下键…

企业级日志分析系统ELK之ELK概述

ELK 概述 ELK 介绍 什么是 ELK 早期IT架构中的系统和应用的日志分散在不同的主机和文件,如果应用出现问题,开发和运维人员想排 查原因,就要先找到相应的主机上的日志文件再进行查找和分析,所以非常不方便,而且还涉及…

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长 《春烂漫:新平摄影作品选》作者新平,2019.12.25年读完的小书,当时就觉得挺不错,今…

每日一站技術架構解析之-cc手機桌布網

# 網站技術架構解析: ## 一、整體架構概述https://tw.ccwallpaper.com是一個提供手機壁紙、桌布免費下載的網站,其技術架構設計旨在實現高效的圖片資源管理與用戶訪問體驗優化。 ### (一)前端展示 1. **HTML/CSS/JavaScript基礎構…

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来,Nacos 2.0 在社区的支持下已走过近三年,期间取得了诸多成就。在高性能与易扩展性方面,Nacos 2.0 取得了显著进展,同时在易用性和安全性上也不断提升。想了解更多详细信息,欢迎阅读我们之前发布的回…

Mybatis -plus -jion的复习

Mybatis -plus -jion 是一个 MyBatis-Plus 的增强工具,在 MyBatis-Plus 的基础上只做增强不做改变,为简化开发、提高效率而生。 - **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 - **损耗小…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

Qt之自定义动态调控是否显示日志

创作灵感 最近在芯驰x9hp上开发仪表应用。由于需要仪表警告音,所以在该平台上折腾并且调试仪表声音的时候,无意间发现使用: export QT_DEBUG_PLUGINS1 可以打印更详细的调试信息。于是想着自己开发的应用也可以这样搞,这样更方便…

右玉200MW光伏电站项目 微气象、安全警卫、视频监控系统

一、项目名称 山西右玉200MW光伏电站项目 微气象、安全警卫、视频监控系统 二、项目背景: 山西右玉光伏发电项目位于右玉县境内,总装机容量为200MW,即太阳能电池阵列共由200个1MW多晶硅电池阵列子方阵组成,每个子方阵包含太阳能…

Java基础学习:java常用启动命令

一、java -jar 1、系统属性传递 使用形式:java -DpathD:\jacoco -jar 获取方式:System.getProperties() 2、系统参数传递 使用形式:java -jar application.jar --jacocoPathD:\tomcat 获取方式:通过启动方法入口main的参数arg…

一级考试真题(2019)

一级考试真题(2019)

echarts图表自定义配置(二)——代码封装

下图是初版,火山图的代码。可以看出,里面的变量,逻辑,函数存在冗余,基本上都是改了参数,同样的get和set,去刷新图表;对于往后继续开发十几二十个图表,会很麻烦。因此需要…

如何用状态图进行设计05

到目前为止,我们已经讨论了状态图的原理。这些原理对状态图和扩展状态图都适用。第二章后面的部分主要讲述了扩展状态图的扩展功能。我们将围绕这些增强的功能,使你对BetterState Pro的设计能力有很好的了解。 关于这些内容和其他有关扩展状态图特性的完…

鸿蒙NEXT开发案例:九宫格随机

【引言】 在鸿蒙NEXT开发中,九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖,用户可以随机获得不同奖品,增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能,并通过代码解析展示实现细节。 【环境准…

【efinance一个2k星的库】

efinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库,回测以及量化交易的好帮手 但没有等比复权的,不用。 import efinance as ef ef.stock.get_quote_history(510880,fqt2)

协同办公软件新升级:细节优化,让办公更简单

细节决定成败,企业酷信协同办公系统通过贴近客户实际需求的一系列改进和创新,在技术架构、系统结构、管理理念和使用性能上,都达到了国内先进水平,同时具备独特的优势。让我们看看企业酷信是如何通过这些细节提升,为企…

【AI知识】有监督学习分类任务之支持向量机

1.支持向量机概念 支持向量机(Support Vector Machine, SVM) 是一种有监督学习算法,主要用于分类任务(也可用于回归任务,即支持向量回归,SVR)。SVM的核心思想是找到一个最优的超平面&#xff0…

MySQL有哪些高可用方案?

大家好,我是锋哥。今天分享关于【MySQL有哪些高可用方案?】面试题。希望对大家有帮助; MySQL有哪些高可用方案? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 高可用方案旨在确保数据库系统的高可靠性、低宕机时间、以及在硬件故障…