用python做一个抖音上很火的罗盘时钟(更新版,并将其做成屏保程序)

最近在抖音上看到一个非常有趣的时钟,但是几乎都是css,html和 js做的。想找一下python的源代码,可是网上都没有相关的资源,有一个用 turtle库做的运行时间长了会一顿一顿的,效果与抖音上刷到的差别较大。于是决定自己写一个,花了两三个晚上学习了一下python的pygame库来做这个事。成品(见下方样图)除了旋转效果与抖音上看到的不大一致之外,基本功能都实现了,现分享一下自己的代码,感兴趣的可以拷贝回去也玩一下!也可以关注我的个人公众号<生信白白>,回复“时钟”或者“罗盘”,看一下动态的视频效果。
罗盘时钟样图,我的公众号有视频效果!

1. 库的安装

首先打开pycharm,在pycharm的terminal中安装几个用到的库pygame和pyinstaller(将python代码打包成exe程序)这个库,如图:

pip3 install pygame pyinstaller -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

2. 代码测试

将下面的代码复制到pycharm中,运行以下,看看有没有报错,没有的话就继续


import math
import pygame
import sys
import tkinter
from datetime import datetime

tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()


def print_text(font, x, y, text, angle, color=(255, 255, 255)):
    """定义一个用于输出指定位置和角度文本的函数"""
    img_text = font.render(text, True, color)
    img_text = pygame.transform.rotate(img_text, angle)
    screen.blit(img_text, (x, y))


def cycle_text(cirText, bins, today_xx, cirRadius, font, color=(255, 255, 255)):
    """
    定义一个输出循环文本的函数
    cirText: 环形循环文本,如日期和时间的中文
    bins: 圆需要分为多少等分,如秒需要分成60等分
    today_xx: 接收当前时间(月日周时分秒)的具体数值
    cirRadius: 指定环形文本的半径
    font: 指定使用的字体
    """
    for i in range(1, len(cirText) + 1):
        # c_angle: 旋转一次的角度
        c_angle = math.radians(360 / bins) * (today_xx - i)
        # t_angle: 环上每个独立文本的角度
        t_angle = 0 - (360 / bins) * (today_xx - i)
        # add_x: 环上每个独立文本的横坐标距离pos_x的距离
        add_x = math.cos(c_angle) * cirRadius
        # add_x: 环上每个独立文本的横坐标距离pos_x的距离
        add_y = math.sin(c_angle) * cirRadius
        # print_text(): 调用上面定义的函数,输出换上每个文本
        print_text(font, pos_x + add_x, pos_y + add_y, str(cirText[i - 1]), angle=t_angle, color=color)


# 初始化一个界面
pygame.init()
# 屏幕大小
screen = pygame.display.set_mode((width, height), pygame.FULLSCREEN)

# 标题
pygame.display.set_caption("Python Clock")
# 月,日,时,分,秒字体
font1 = pygame.font.Font("C:/Windows/Fonts/msyh.ttc", 16)
# 年字体
font2 = pygame.font.Font("C:/Windows/Fonts/msyh.ttc", 25)
# 周字体
font3 = pygame.font.Font("C:/Windows/Fonts/msyh.ttc", 22)
# 时钟中心
pos_x = width / 2
pos_y = (height / 2) - 30
r = 395
# 年月日周时分秒对应中文字符
secondsText = ["零壹秒", "零贰秒", "零叁秒", "零肆秒", "零伍秒", "零陆秒", "零柒秒", "零捌秒", "零玖秒", "壹拾秒", "拾壹秒", "拾贰秒", "拾叁秒",
               "拾肆秒", "拾伍秒", "拾陆秒", "拾柒秒", "拾捌秒", "拾玖秒", "贰拾秒", "贰拾壹秒", "贰拾贰秒", "贰拾叁秒", "贰拾肆秒", "贰拾伍秒",
               "贰拾陆秒", "贰拾柒秒", "贰拾捌秒", "贰拾玖秒", "叁拾秒", "叁拾壹秒", "叁拾贰秒", "叁拾叁秒", "叁拾肆秒", "叁拾伍秒", "叁拾陆秒",
               "叁拾柒秒", "叁拾捌秒", "叁拾玖秒", "肆拾秒", "肆拾壹秒", "肆拾贰秒", "肆拾叁秒", "肆拾肆秒", "肆拾伍秒", "肆拾陆秒", "肆拾柒秒",
               "肆拾捌秒", "肆拾玖秒", "伍拾秒", "伍拾壹秒", "伍拾贰秒", "伍拾叁秒", "伍拾肆秒", "伍拾伍秒", "伍拾陆秒", "伍拾柒秒", "伍拾捌秒",
               "伍拾玖秒", "零   秒"]
minuteText = ["零壹分", "零贰分", "零叁分", "零肆分", "零伍分", "零陆分", "零柒分", "零捌分", "零玖分", "壹拾分", "拾壹分", "拾贰分", "拾叁分",
              "拾肆分", "拾伍分", "拾陆分", "拾柒分", "拾捌分", "拾玖分", "贰拾分", "贰拾壹分", "贰拾贰分", "贰拾叁分", "贰拾肆分", "贰拾伍分",
              "贰拾陆分", "贰拾柒分", "贰拾捌分", "贰拾玖分", "叁拾分", "叁拾壹分", "叁拾贰分", "叁拾叁分", "叁拾肆分", "叁拾伍分", "叁拾陆分",
              "叁拾柒分", "叁拾捌分", "叁拾玖分", "肆拾分", "肆拾壹分", "肆拾贰分", "肆拾叁分", "肆拾肆分", "肆拾伍分", "肆拾陆分", "肆拾柒分",
              "肆拾捌分", "肆拾玖分", "伍拾分", "伍拾壹分", "伍拾贰分", "伍拾叁分", "伍拾肆分", "伍拾伍分", "伍拾陆分", "伍拾柒分", "伍拾捌分",
              "伍拾玖分", "零   分"]
hourText = ["零壹点", "零两点", "零叁点", "零肆点", "零伍点", "零陆点", "零柒点", "零捌点", "零玖点", "壹拾点", "拾壹点", "拾贰点",
            "拾叁点", "拾肆点", "拾伍点", "拾陆点", "拾柒点", "拾捌点", "拾玖点", "贰拾点", "贰拾壹点", "贰拾贰点", "贰拾叁点", "零   点"]
weekText = ["星期壹", "星期贰", "星期叁", "星期肆", "星期伍", "星期陆", "星期日"]
dayText = ["零壹日", "零贰日", "零叁日", "零肆日", "零伍日", "零陆日", "零柒日", "零捌日", "零玖日", "壹拾日", "拾壹日", "拾贰日",
           "拾叁日", "拾肆日", "拾伍日", "拾陆日", "拾柒日", "拾捌日", "拾玖日", "贰拾日", "贰拾壹日", "贰拾贰日", "贰拾叁日",
           "贰拾肆日", "贰拾伍日", "贰拾陆日", "贰拾柒日", "贰拾捌日", "贰拾玖日", "叁拾日", "叁拾壹日"]
monthText = ["零壹月", "零贰月", "零叁月", "零肆月", "零伍月", "零陆月", "零柒月", "零捌月", "零玖月", "拾  月", "拾壹月", "拾贰月"]
# 为了更方便的提取年对应的中文字符,先自动生成一个数字列表,将第2020-2050个元素更换为2020年-2050年对应的中分字符
yearText = list(range(1, 3000))
yearText[2020:2051] = ["贰零贰零年", "贰零贰壹年", "贰零贰贰年", "贰零贰叁年", "贰零贰肆年", "贰零贰伍年", "贰零贰陆年", "贰零贰柒年",
                       "贰零贰捌年", "贰零贰玖年", "贰零叁零年", "贰零叁壹年", "贰零叁贰年", "贰零叁叁年", "贰零叁肆年", "贰零叁伍年",
                       "贰零叁陆年", "贰零叁柒年", "贰零叁捌年", "贰零叁玖年", "贰零肆零年", "贰零肆壹年", "贰零肆贰年", "贰零肆叁年",
                       "贰零肆肆年", "贰零肆伍年", "贰零肆陆年", "贰零肆柒年", "贰零肆捌年", "贰零肆玖年", "贰零伍零年"]

while True:
    # 鼠标点击x或按下键盘esc键时退出
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    keys = pygame.key.get_pressed()
    if keys[pygame.K_ESCAPE]:
        sys.exit()
    # 填充背景颜色
    screen.fill(color=(0, 115, 120))
    # screen.fill(color=(0, 0, 0))

    # 绘制一条表明当前日期时间的红线
    # pygame.draw.circle(screen, color="red", center=(pos_x, pos_x), radius=10, width=5,)
    pygame.draw.line(screen, color="red", start_pos=(pos_x+15, pos_y + 25), end_pos=(pos_x+r+60, pos_y + 25), width=2)

    # 获取当前年份
    year = datetime.today().year
    # 输出当前年份
    print_text(font2, pos_x - 35, pos_y - 15, text=yearText[year], angle=0, color="red")

    # 获取当前月份
    months = datetime.today().month
    # 输出月环(会根据月份的变化,顺时针方向旋转,红线处为当前月份)
    cycle_text(cirText=monthText, bins=12, today_xx=months, cirRadius=r - 290, font=font1, color="white")
    # 天数这里需要考虑闰年和非闰年以及每月天数不一致的情况
    days = datetime.today().day
    if months in [1, 3, 5, 7, 8, 10, 12]:
        cycle_text(cirText=dayText, bins=31, today_xx=days, cirRadius=r - 225, font=font1, color="white")
    elif months in [4, 6, 9, 11]:
        cycle_text(cirText=dayText[0:-1], bins=30, today_xx=days, cirRadius=r - 225, font=font1, color="white")
    elif months == 2:
        if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
            '''如果是闰年'''
            cycle_text(cirText=dayText[0:-2], bins=29, today_xx=days, cirRadius=r - 225, font=font1, color="white")
        else:
            '''如果是非闰年'''
            cycle_text(cirText=dayText[0:-3], bins=28, today_xx=days, cirRadius=r - 225, font=font1, color="white")
    # 以下周,时,分,秒与月环相似
    weeks = datetime.today().isoweekday()
    print_text(font3, pos_x - 8, pos_y + 30, text=weekText[weeks-1], angle=0, color="blue")
    # cycle_text(cirText=weekText, bins=7, today_xx=weeks, cirRadius=r - 185, font=font1, color="white")
    hours = datetime.today().hour % 24
    cycle_text(cirText=hourText, bins=24, today_xx=hours, cirRadius=r - 150, font=font1, color="white")
    minutes = datetime.today().minute
    cycle_text(cirText=minuteText, bins=60, today_xx=minutes, cirRadius=r - 75, font=font1, color="white")
    seconds = datetime.today().second
    cycle_text(cirText=secondsText, bins=60, today_xx=seconds, cirRadius=r, font=font1, color="white")
    # 最后别忘记刷新一下界面
    pygame.display.update()


3. 安装程序打包(2022.02.26更)

使用pyinstaller打包成exe程序

pyinstaller -F -w ./main.py

这行命令运行完之后,在./目录下会多出两个文件夹和一个.spec的文件,如图:
在这里插入图片描述打开./build文件夹,里面有一个.exe程序,该程序就是打包成的可执行程序(只要这个程序,其他生成的文件都是可以删除的)。将这个文件的拓展名由main.exe改成pythonClock.scr, 然后将它复制到C:\Windows\system32\目录下。

4. 设置屏幕保护(Windows11)

桌面右键–个性化–锁屏界面–屏幕保护程序–弹出以下窗口;
在屏幕保护程序处选择pythonClock,应用确定即可(不过存在个BUG,退出屏保必需要按Esc,光动鼠标或者按键盘其他键无法退出这个界面,后续看看能不能解决这个问题!)。
如果不想折腾,也可以到我的公众号回复“屏保”下载pythonClock.scr文件
在这里插入图片描述

在这里插入图片描述

  • 15
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
要使用Python制作一个抖音上很罗盘时钟,你需要使用turtle模块和time模块。 首先,导入所需的模块: import turtle import time 然后,设置画布和画笔: window = turtle.Screen() window.bgcolor("black") window.title("抖音罗盘时钟") window.setup(width=800, height=600) window.tracer(0) pen = turtle.Turtle() pen.hideturtle() pen.speed(0) pen.pensize(3) pen.color("white") 接下来,绘制罗盘的外环: pen.penup() pen.goto(0, -250) pen.pendown() pen.circle(250) 然后,绘制12个刻度线和对应的小时数字: pen.penup() pen.goto(0, 0) pen.setheading(30) for i in range(12): pen.penup() pen.forward(220) pen.pendown() pen.forward(30) pen.penup() pen.forward(20) pen.write(i+1, align="center", font=("Arial", 12, "normal")) pen.backward(270) pen.right(30) 接着,绘制指针: hour_hand = turtle.Turtle() hour_hand.shape("arrow") hour_hand.color("white") hour_hand.speed(0) minute_hand = turtle.Turtle() minute_hand.shape("arrow") minute_hand.color("white") minute_hand.speed(0) second_hand = turtle.Turtle() second_hand.shape("arrow") second_hand.color("red") second_hand.speed(0) 然后,创建一个函数来更新指针的位置: def update_clock(): current_time = time.localtime() hour = current_time.tm_hour % 12 minute = current_time.tm_min second = current_time.tm_sec hour_angle = (hour * 30) + (minute * 0.5) minute_angle = (minute * 6) + (second * 0.1) second_angle = second * 6 hour_hand.setheading(-hour_angle) minute_hand.setheading(-minute_angle) second_hand.setheading(-second_angle) turtle.ontimer(update_clock, 1000) 最后,调用更新函数并保持运行: update_clock() turtle.done() 这样,一个抖音上很罗盘时钟就完成了。每秒钟指针都会动态更新,显示当前时间。你可以在窗口中看到一个罗盘,外环上是小时刻度线和对应的数字,中间有时、分、秒指针。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值