当前位置: 首页 > article >正文

Python 写的《桌面时钟》屏保

原代码:

# 日历式时钟
# 导入所需的库
# 作者:Hoye
# 日期:2024年12月16日
# 功能:显示当前日期、星期、时间,并显示模拟时钟
import tkinter as tk
from tkinter import ttk
import time
import math
import sys

def exit_screensaver(event=None):
    root.quit()

def draw_clock_face():
    # 清除画布
    clock_canvas.delete("all")
    
    # 获取当前时间
    current_time = time.localtime()
    hours = current_time.tm_hour % 12
    minutes = current_time.tm_min
    seconds = current_time.tm_sec
    
    # 时钟外圈
    clock_canvas.create_oval(10, 10, 390, 390, width=2, outline="#ECF0F1")
    
    # 绘制刻度和数字
    for i in range(12):
        angle = i * math.pi/6 - math.pi/2
        # 刻度线
        start_x = 200 + 190 * math.cos(angle)
        start_y = 200 + 190 * math.sin(angle)
        end_x = 200 + 180 * math.cos(angle)
        end_y = 200 + 180 * math.sin(angle)
        width = 3 if i % 3 == 0 else 1
        clock_canvas.create_line(start_x, start_y, end_x, end_y, fill="#ECF0F1", width=width)
        
        # 添加数字
        num = 12 if i == 0 else i
        text_x = 200 + 155 * math.cos(angle)
        text_y = 200 + 155 * math.sin(angle)
        clock_canvas.create_text(text_x, text_y, text=str(num), 
                               font=("Microsoft YaHei UI", 20, "bold"),
                               fill="#ECF0F1")
    
    # 时针
    hour_angle = (hours + minutes/60) * math.pi/6 - math.pi/2
    hour_x = 200 + 100 * math.cos(hour_angle)
    hour_y = 200 + 100 * math.sin(hour_angle)
    clock_canvas.create_line(200, 200, hour_x, hour_y, fill="#3498DB", width=8)
    
    # 分针
    min_angle = minutes * math.pi/30 - math.pi/2
    min_x = 200 + 140 * math.cos(min_angle)
    min_y = 200 + 140 * math.sin(min_angle)
    clock_canvas.create_line(200, 200, min_x, min_y, fill="#ECF0F1", width=6)
    
    # 秒针
    sec_angle = seconds * math.pi/30 - math.pi/2
    sec_x = 200 + 160 * math.cos(sec_angle)
    sec_y = 200 + 160 * math.sin(sec_angle)
    clock_canvas.create_line(200, 200, sec_x, sec_y, fill="#BDC3C7", width=2)
    
    # 中心点
    clock_canvas.create_oval(195, 195, 205, 205, fill="#3498DB")
    
    # 每秒更新
    root.after(1000, draw_clock_face)

def update_clock():
    current_time = time.localtime()
    
    year = current_time.tm_year
    month = current_time.tm_mon
    day = current_time.tm_mday
    weekday = current_time.tm_wday
    hours = current_time.tm_hour
    minutes = current_time.tm_min
    seconds = current_time.tm_sec

    date_str = f"{year}年{month:02d}月{day:02d}日"
    weekday_str = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"][weekday]
    time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}"

    date_label.config(text=date_str)
    weekday_label.config(text=weekday_str)
    time_label.config(text=time_str)

    root.after(1000, update_clock)

# 创建主窗口
root = tk.Tk()
root.title("蓝动力电脑-桌面时钟")

# 设置全屏
root.attributes('-fullscreen', True)  # 全屏显示
root.attributes('-topmost', True)     # 窗口置顶
root.config(cursor="none")           # 隐藏鼠标光标

# 绑定退出事件
root.bind('<Key>', exit_screensaver)        # 任意键退出
root.bind('<Motion>', exit_screensaver)     # 鼠标移动退出
root.bind('<Button>', exit_screensaver)     # 鼠标点击退出
root.bind('<Escape>', exit_screensaver)     # ESC键退出

# 获取屏幕尺寸
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

# 设置背景渐变色
main_frame = tk.Frame(root)
main_frame.pack(expand=True, fill='both')
main_frame.configure(bg='#2C3E50')

# 创建内容框架
content_frame = tk.Frame(main_frame, bg='#2C3E50', padx=20, pady=20)
content_frame.pack(expand=True)

# 创建左侧模拟时钟框架
analog_frame = tk.Frame(content_frame, bg='#34495E', padx=30, pady=30)
analog_frame.pack(side='left', padx=20)

# 创建模拟时钟画布
clock_canvas = tk.Canvas(
    analog_frame,
    width=400,
    height=400,
    bg='#34495E',
    highlightthickness=0
)
clock_canvas.pack()

# 创建右侧数字时钟容器
clock_frame = tk.Frame(content_frame, bg='#34495E', padx=30, pady=30)
clock_frame.pack(side='right', padx=20)

# 日期标签
date_label = tk.Label(
    clock_frame,
    font=("Microsoft YaHei UI", 48, "bold"),
    fg="#ECF0F1",
    bg="#34495E"
)
date_label.pack(pady=20)

# 星期标签
weekday_label = tk.Label(
    clock_frame,
    font=("Microsoft YaHei UI", 36),
    fg="#BDC3C7",
    bg="#34495E"
)
weekday_label.pack(pady=20)

# 时间标签
time_label = tk.Label(
    clock_frame,
    font=("Microsoft YaHei UI", 120, "bold"),
    fg="#3498DB",
    bg="#34495E"
)
time_label.pack(pady=30)

# 添加版权信息
footer_label = tk.Label(
    main_frame,
    text="蓝动力电脑 © 2024",
    font=("Microsoft YaHei UI", 14),
    fg="#95A5A6",
    bg="#2C3E50"
)
footer_label.pack(side='bottom', pady=15)

# 启动时钟更新
update_clock()
draw_clock_face()

# 启动主循环
root.mainloop()

代码简说:

1. 添加了 exit_screensaver 函数处理退出事件  

2. 设置窗口属性:  

• root.attributes('-fullscreen', True) 实现全屏显示  

• root.attributes('-topmost', True) 使窗口始终置顶  

• root.config(cursor="none") 隐藏鼠标光标  

3. 绑定各种退出事件:  

• 键盘按键  

• 鼠标移动  

• 鼠标点击 

打包成exe 再改 成 .scr

setup.py

import PyInstaller.__main__

PyInstaller.__main__.run([
    '9_日历式时钟.py',
    '--name=蓝动力时钟屏保',
    '--noconsole',
    '--onefile',
    # '--icon=clock.ico',  # 如果您有图标文件的话
    '--windowed',
])

py setup.py

1. 打包完成后,在 dist 目录下找到生成的 exe 文件  

2. 将 exe 文件复制一份,改名为 .scr 后缀  • 例如:蓝动力时钟屏保.exe → 蓝动力时钟屏保.scr  

3. 将 .scr 文件复制到 Windows 系统目录:

 • 通常是 C:\Windows\System32

 • 或者 C:\Windows\SysWOW64(64位系统)

 4. 在 Windows 设置中设置屏保:

 • 右键桌面 → 个性化

 • 锁屏界面 → 屏幕保护程序设置

 • 在屏幕保护程序下拉菜单中选择"蓝动力时钟屏保"

 

 


http://www.kler.cn/a/441456.html

相关文章:

  • 每日十题八股-2025年1月23日
  • LINUX下设置分离状态(Detached State)和未设置分离状态的主要区别在于线程资源的管理方式和线程的生命周期。以下是两种状态的对比:
  • Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具
  • 防火墙安全策略
  • docker-registry
  • leetcode 121. 买卖股票的最佳时机
  • React自学:如何使用localStorage,以及如何实现删除笔记操作
  • docker-4.迁移存储目录
  • 04 条件渲染
  • 《红队蓝队在网络安全对抗演练中的运作模式》
  • 日拱一卒(16)——leetcode学习记录:山脉数组峰值索引
  • CTF知识集-SQL注入
  • oracle创建用户,并授权dba权限
  • RabbitMQ基本使用以及整合Java项目
  • linux上qt打包(二)
  • Windows环境 (Ubuntu 24.04.1 LTS ) 国内镜像,用apt-get命令安装RabbitMQ,java代码样例
  • Windows server服务器之网络安全管理(防火墙入站规则创建)
  • C# 23种设计模式(4)访问者模式(Visitor Pattern)
  • @pytest.fixture() 跟 @pytest.fixture有区别吗?
  • 机器学习实战31-基于机器学习算法对某年福州市各初中重点高中录取率进行数学分析,评估性价比较高的学校。
  • 探索 PIE 在 ESP32-P4 上的应用
  • 找出一个数组中出现次数最多的那个元素。:哈希表:JAVA
  • SQL, 将分段数不确定的字符串拆分成多列
  • Android之RecyclerView显示数据列表和网格
  • 2024-12-16 装有Ubuntu系统的移动硬盘使用windows系统对其进行格式化
  • SpringDataJpa-字段加解密存储