首页 > 编程语言 >python制作罗盘时钟

python制作罗盘时钟

时间:2024-04-16 09:44:57浏览次数:11  
标签:__ python screen datetime 时钟 pygame 罗盘 math 255

背景图

import sys
import math
import pygame
from datetime import datetime
from pygame import display, image, font, transform

# 创建罗盘时钟的窗口
def createWindow():
    pygame.init()
    screen = display.set_mode((800, 700), pygame.RESIZABLE)
    display.set_caption("炫酷星空版罗盘时钟")
    return screen

# 年月日转换中文字符
def timeConvertText(year, month, day):
    # 制作转换字符集
    timeSet = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "二十一", "二十二", "二十三", "二十四", "二十五", "二十六", "二十七", "二十八", "二十九", "三十"]
    yearText = ""
    timeText = ""
    # 进行字符的拼接
    while year > 0:
        num = int(year % 10)
        yearText = yearText + timeSet[num]
        year = year // 10

    for i in range(yearText.__len__()):
        timeText += yearText[yearText.__len__() - i - 1]

    timeText += "年"
    timeText += timeSet[month]
    timeText += "月"
    timeText += timeSet[day]
    timeText += "日"

    return timeText

# 制作罗盘时钟的表盘
def createClockDial(screen):
    # 设置时钟背景
    background = image.load("./black.jpg")
    screen.blit(background, (0, 0)) # 坐标左上
    # 导入字体文件
    clockFont = font.Font('C:\Windows\Fonts\simhei.ttf', 18)
    # 设置时钟中心
    clockCenterX = 380
    clockCenterY = 320
    # 时分秒数据集
    hoursSet = ["一  点", "二  点", "三  点", "四  点", "五  点", "六  点", "七  点", "八  点",
                "九  点", "十  点", "十一点", "十二点", "十三点", "十四点", "十五点", "十六点",
                "十七点", "十八点", "十九点", "二十点", "二一点", "二二点", "二三点", "二四点"]
    minutesSet = ["一  分", "二  分", "三  分", "四  分", "五  分", "六  分", "七  分", "八  分",
                  "九  分", "十  分", "十一分", "十二分", "十三分", "十四分", "十五分", "十六分",
                  "十七分", "十八分", "十九分", "二十分", "二一分", "二二分", "二三分", "二四分",
                  "二五分", "二六分", "二七分", "二八分", "二九分", "三十分", "三一分", "三二分",
                  "三三分", "三四分", "三五分", "三六分", "三七分", "三八分", "三九分", "四十分",
                  "四一分", "四二分", "四三分", "四四分", "四五分", "四六分", "四七分", "四八分",
                  "四九分", "五十分", "五一分", "五二分", "五三分", "五四分", "五五分", "五六分",
                  "五七分", "五八分", "五九分", "六十分"]
    secondsSet = ["一  秒", "二  秒", "三  秒", "四  秒", "五  秒", "六  秒", "七  秒", "八  秒",
                  "九  秒", "十  秒", "十一秒", "十二秒", "十三秒", "十四秒", "十五秒", "十六秒",
                  "十七秒", "十八秒", "十九秒", "二十秒", "二一秒", "二二秒", "二三秒", "二四秒",
                  "二五秒", "二六秒", "二七秒", "二八秒", "二九秒", "三十秒", "三一秒", "三二秒",
                  "三三秒", "三四秒", "三五秒", "三六秒", "三七秒", "三八秒", "三九秒", "四十秒",
                  "四一秒", "四二秒", "四三秒", "四四秒", "四五秒", "四六秒", "四七秒", "四八秒",
                  "四九秒", "五十秒","五一秒", "五二秒", "五三秒", "五四秒", "五五秒", "五六秒",
                  "五七秒", "五八秒", "五九秒", "六十秒"]

    # 获取当前时间
    year = datetime.today().year
    month = datetime.today().month
    day = datetime.today().day
    hour = datetime.today().hour
    minute = datetime.today().minute
    second = datetime.today().second

    # 时间字符转换
    yearMonthDayText = timeConvertText(year, month, day)
    # 设置样式颜色
    yearMonthDayText = clockFont.render(yearMonthDayText, True, (255, 0, 0))
    # 指定位置绘制
    screen.blit(yearMonthDayText, (clockCenterX - 60, clockCenterY))

    # 绘制小时罗盘
    for i in range(hoursSet.__len__()):
        if i == 0:
            hourText = clockFont.render(hoursSet[hour], True, (255, 0, 0))
        else:
            hourText = clockFont.render(hoursSet[hour], True, (255, 255, 255))
        hourText = transform.rotate(hourText, 0 - (15 * i))
        hourTextX = int(math.cos(math.radians(15 * i)) * 120)
        hourTextY = int(math.sin(math.radians(15 * i)) * 120)
        screen.blit(hourText, (clockCenterX + hourTextX, clockCenterY + hourTextY))
        hour += 1
        if hour == 24:
            hour = 0

    # 绘制分钟罗盘
    for j in range(minutesSet.__len__()):
        if j == 0:
            minuteText = clockFont.render(minutesSet[minute], True, (255, 0, 0))
        else:
            minuteText = clockFont.render(minutesSet[minute], True, (255, 255, 255))
        minuteText = transform.rotate(minuteText, 0 - (6 * j))
        minuteTextX = int(math.cos(math.radians(6 * j)) * 200)
        minuteTextY = int(math.sin(math.radians(6 * j)) * 200)
        screen.blit(minuteText, (clockCenterX + minuteTextX, clockCenterY + minuteTextY))
        minute += 1
        if minute == 60:
            minute = 0

    # 绘制秒种罗盘
    for k in range(secondsSet.__len__()):
        if k == 0:
            secondText = clockFont.render(secondsSet[second], True, (255, 0, 0))
        else:
            secondText = clockFont.render(secondsSet[second], True, (255, 255, 255))
        secondText = transform.rotate(secondText, 0 - (6 * k))
        secondTextX = int(math.cos(math.radians(6 * k)) * 280)
        secondTextY = int(math.sin(math.radians(6 * k)) * 280)
        screen.blit(secondText, (clockCenterX + secondTextX, clockCenterY + secondTextY))
        second += 1
        if second == 60:
            second = 0
    display.update()

if __name__ == "__main__":
    screen = createWindow()
    while True:
        # 设置监听事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            keys = pygame.key.get_pressed()
            if keys[pygame.K_ESCAPE]:
                pygame.quit()
                sys.exit()
        screen.fill((0,0,0))
        createClockDial(screen)

标签:__,python,screen,datetime,时钟,pygame,罗盘,math,255
From: https://www.cnblogs.com/qcy-blog/p/18137450

相关文章

  • python 序列类型 元组
    元组定义元组是不可变序列,通常用于储存异构数据的多项集(例如由enumerate()内置函数所产生的二元组)。元组也被用于需要同构数据的不可变序列的情况(例如允许存储到set或dict的实例)。元组是Python中的一种数据结构,类似于列表,但是元组是不可变的,意味着一旦创建,元组内的元素......
  • Python中两种网络编程方式:Socket和HTTP协议
    本文分享自华为云社区《Python网络编程实践从Socket到HTTP协议的探索与实现》,作者:柠檬味拥抱。在当今互联网时代,网络编程是程序员不可或缺的一项技能。Python作为一种高级编程语言,提供了丰富的网络编程库,使得开发者能够轻松地实现各种网络应用。本文将介绍Python中两种主要的网络......
  • 19、python 脚本
    1.python安装及配置下载地址python2和python3共存安装2.python可视化importturtleturtle.pensize(2)#画一个小圆turtle.circle(10)turtle.circle(40)turtle.circle(80)turtle.circle(160)工具:pythonIDE:pycharmhttps://pan.baidu.com/s/1s_bkgDT0QxNTQY07L......
  • python (63):dataclasses 简单示例
    dataclasses简单示例:importtransformersfromdataclassesimportdataclass,fieldimportargparse@dataclassclassPerson():age:int=field(default=10)Name:str=field(default="Tom")high:int=field(default=185,......
  • python基础-函数(lambda表达式、函数作参数、内置函数、推导式)和pip
    函数进阶今日概要:函数名就是一个变量(扩展)匿名函数(lambda表达式)重点内置函数——python内置函数推导式(一行代码生成数据)1.函数名就是变量deffunc():passv1=funcv1()func()defregister():...deflogin():...def......
  • Python迭代器与生成器
    一、迭代器和生成器的定义可迭代对象并不是指某一个数据类型,而是特指存储了元素的一个容器对象。这里的容器对象可以具象为:列表、字典、元组、字符串、range都算是一个"容器"。可迭代对象有个方法叫_iter_()方法,翻译过来叫做迭代。纯可迭代对象的内部数据"所见即所得",可迭代的数......
  • Python - PEP572: 海象运算符
    海象运算符PEP572的标题是「AssignmentExpressions」,也就是「赋值表达式」,也叫做「命名表达式」不过它现在被广泛的别名是「海象运算符」(TheWalrusOperator),因为:=很像海象赋值中间变量未使用海象运算符pattern=re.compile('s')data='ss'match=pattern.mat......
  • Python调用微信OCR识别文字和坐标
    原理在看雪看到一篇文章:逆向调用QQ截图NT与WeChatOCR-软件逆向。里面说了怎么调用微信和QQ本地的OCR模型,还有很详细的分析过程。我稍微看了下文章,多的也看不懂。大概流程是使用mmmojo.dll这个dll来与WeChatOCR.exe做通信的,也是用它来启动和关闭WeChatOCR.exe进程的。所以关键只......
  • Python列表推导式
    一、列表推导列表推导式又称推导列表。列表推导式是以列表为载体,以推导的方式将数据生成并放在列表中。推导即规则,它支持for循环和筛选模式(if判断模式)。设定一个既定规则在列表中进行数据生成,列表推导式比传统方法更为简洁,代价是放弃一部分的可读性。二、如何声明列表推导式最......
  • python命令行工具:fire
    fire 是一个由Google开源的Python库,它能自动将Python代码转换成命令行接口(CommandLineInterface,CLI)。fire 库极大地简化了从Python函数或类生成命令行工具的过程。特性易用性:fire 是为了简化命令行工具的创建而设计的,它可以自动从任何Python对象生成命令行接口......