吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3852|回复: 43
收起左侧

[Python 原创] 基于python的动态时钟,带十二时辰和经络养身

  [复制链接]
lookteas 发表于 2022-12-7 18:02
本帖最后由 lookteas 于 2022-12-7 18:05 编辑

image.png

仅用来研究学习用
除正常显示时钟外,还可以实时显示当前对应的时辰,和经络养身提示。适合辅助上班族来养生哈


源码如下:


[Python] 纯文本查看 复制代码
'''
动态时钟附带十二时辰显示
'''
import turtle                 # 导入绘图海龟模块
import datetime               # 导入日期时间模块

# 十二时辰对照表(地支)
dizhi = {
        '23': ['子','胆经当令, 万籁俱静正好眠'],
        '0': ['子','胆经当令, 万籁俱静正好眠'],
        '1': ['丑','肝经当令,肝脏藏血不熬夜'],
        '2': ['丑','肝经当令,肝脏藏血不熬夜'],
        '3': ['寅','肺经当令,肺脏主气好歇息'],
        '4': ['寅','肺经当令,肺脏主气好歇息'],
        '5': ['卯','大肠经当令,大肠当值宜排便'],
        '6': ['卯','大肠经当令,大肠当值宜排便'],
        '7': ['辰','胃经当令,食用早餐正当时'],
        '8': ['辰','胃经当令,食用早餐正当时'],
        '9': ['巳','脾经当令,脾经当值精神足'],
        '10': ['巳','脾经当令,脾经当值精神足'],
        '11': ['午','心经当令,心主神明当小憩'],
        '12': ['午','心经当令,心主神明当小憩'],
        '13': ['未','小肠经当令,畅通血管多喝水'],
        '14': ['未','小肠经当令,畅通血管多喝水'],
        '15': ['申','膀胱经当令,工作学习练身体'],
        '16': ['申','膀胱经当令,工作学习练身体'],
        '17': ['酉','肾经当令,养经两相宜'],
        '18': ['酉','肾经当令,养经两相宜'],
        '19': ['戌','心包经当令,心包当令宜散步谈心'],
        '20': ['戌','心包经当令,心包当令宜散步谈心'],
        '21': ['亥','三焦经当令,温水泡脚助安眠'],
        '22': ['亥','三焦经当令,温水泡脚助安眠']
}

# 获取当前时间
today = datetime.datetime.today()

# 移动一段距离
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
            if i == 0:               # 判断第一个位置为12点
                # 写入数字12
                turtle.write(12, align='center', font=('Courier', 14, 'bold'))
            elif i == 25 or i == 30 or i == 35:    # 5、6、7
                skip(25)   # 避免与刻度重叠,所以多移动一段距离
                # 根据i除以5获取,5点、6点、7点并写入对应的数字
                turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))
                skip(-25)  # 回到原位置
            else:
                # 根据i除以5获取其它时间的数字并写入
                turtle.write(int(i/5), align='center', font=('Courier', 14, 'bold'))
            skip(-20)      # 复原小时刻度的位置
        else:
            turtle.pensize(1)      # 将画笔大小设置为1
            turtle.dot()           # 绘制分钟刻度的小圆点
        skip(-160)                 # 回到中心位置
        turtle.right(6)            # 向右旋转6度


def draw_shichen_clock_dial(shichen):        # 绘制十二时辰表盘的方法
    today = datetime.datetime.today()
    forenoon,afternoon = {},{}
    for i in shichen.items():
        if int(i[0]) >= 12:
            afternoon[i[0]] = i[1]
        else:
            forenoon[i[0]] = i[1]
    
    # 做个判断,大于12点用后半日时辰
    if today.hour >= 12:
        show_shichen_time = afternoon
    else:
        show_shichen_time = forenoon

    for i in show_shichen_time.items():       # 循环执行12次,一圈为360度所以每次的角度为30度
        skip(240)
        turtle.write(i[1][0], align='center', font=('Courier', 16, 'bold'))
        skip(-240)                  # 回到中心位置
        turtle.right(30)            # 向右旋转30度



def draw_old_clock_dial():    # 绘制表盘的当前时辰和当值经络
    turtle.hideturtle()       # 隐藏箭头
    skip(100)
    turtle.color('red')
    shichen = get_sc(today.hour)
    turtle.write('当前:'+ shichen[0], align='center', font=('Courier', 16, 'bold'))
    skip(-380)
    turtle.write(shichen[1], align='center', font=('Courier', 16, 'bold'))
    skip(280)               # 回中心点位置


# 获取时间对应的具体时辰
def get_sc(hour):
    shichen = []
    if hour >= 0:
        hour = str(hour)
        shichen.append(dizhi.get(hour)[0] + '时')
        shichen.append(dizhi.get(hour)[1])
    else:
        shichen = '时间参数错误'
    return shichen

def get_week(t):                   # 获取星期的方法
    week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
    return week[t.weekday()]       # 返回当天的星期

def create_pointer(length, name, color = 'red'):  # 创建指针方法
    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(80,"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(650, 650)      # 创建窗体大小
    init_pointer()              # 调用初始化指针的方法
    turtle.tracer(False)        # 关闭绘画效果
    draw_clock_dial()            # 绘制表盘
    draw_shichen_clock_dial(dizhi)
    draw_old_clock_dial()        # 绘制十二时辰表盘
    move_pointer()               # 调用移动指针的方法
    turtle.mainloop()            # 不关闭窗体

微信截图_20221207180321.png

免费评分

参与人数 14吾爱币 +20 热心值 +11 收起 理由
zz013 + 1 + 1 谢谢@Thanks!
ylu + 1 谢谢@Thanks!
hahalili11 + 1 热心回复!
ykzhuyu + 1 + 1 谢谢@Thanks!
春又来人已去 + 1 + 1 我很赞同!
小白无常 + 1 + 1 我很赞同!
Qiaoyuexuan + 1 + 1 谢谢@Thanks!
yuwen998 + 1 + 1 谢谢@Thanks!
ibilibili + 1 + 1 我很赞同!
54amm + 1 + 1 用心讨论,共获提升!
wushaominkk + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yzmb8456 + 1 + 1 用心讨论,共获提升!
ee789852 + 1 + 1 请问,write的位置,能指定到其它地方吗?
zhaoqingdz + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| lookteas 发表于 2023-1-27 09:15
qixia888 发表于 2023-1-24 11:50
非常喜欢,遗憾的是自己不会打包

打包了一个exe文件,在这里 https://wwtv.lanzoum.com/ioQuM0lvso2h
 楼主| lookteas 发表于 2023-2-20 20:58
ykzhuyu 发表于 2023-2-18 23:43
这个时钟有点费电,cpu占用20%。

好眼力,这都被你发现了。占用率高的原因:
1:代码没有做任何优化,只是为了熟悉十二时辰和北京时间的对应关系
2:程序运行时每秒钟都会去调用时间接口判断当前在哪个时辰段
3:与第二点一样,每秒钟都会调用绘制图像的api来画时钟的走向

平时工作忙,没时间搞,大佬可以优化优化
 楼主| lookteas 发表于 2022-12-8 17:55
ee789852 发表于 2022-12-8 09:07
write 放置的位置 align,只能三个位置吗?left,right,center

能指定位置不,被指针挡住了

write 方法中align参数只有这几个位置,因为它本身只是用来做字符串书写用的,如果要在特定的位置书写的话可以配合forward方法来实现
明月清疯 发表于 2022-12-7 20:34
好玩。实用,对旧时间有了认识
viperisher 发表于 2022-12-7 20:35
感谢分享,下载试用一下
hayreddin 发表于 2022-12-7 20:38
多谢大佬分享!学习学习~
youremperor 发表于 2022-12-7 20:47
感谢分享,这个有点意思
ee789852 发表于 2022-12-8 09:07
write 放置的位置 align,只能三个位置吗?left,right,center

能指定位置不,被指针挡住了
zhangyu1225 发表于 2022-12-8 11:49
66666,学习学习
liugougou 发表于 2022-12-8 13:46
感谢分享
hemingway111 发表于 2022-12-8 14:30
感谢分享,很实用
cnwutianhao 发表于 2022-12-8 17:23
感谢分享,很实用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-15 10:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表