返回顶部
首页 > 资讯 > 后端开发 > Python >利用Python制作自已的动态屏保
  • 200
分享到

利用Python制作自已的动态屏保

Python动态屏保Python屏保 2022-12-20 18:12:31 200人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

我的环境 win10 python3.X PyCharm 1.编写自己的屏保程序 注意:屏保程序打开就是全屏,可自动循环播放 我的样子如图 1、代码准备 gitee下载 impor

我的环境

win10

python3.X

PyCharm

1.编写自己的屏保程序

注意:屏保程序打开就是全屏,可自动循环播放

我的样子如图

1、代码准备

gitee下载

import os

# 必须在加载 加之前
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d, %d" % (0, 30)

import random
import pygame
from pygame.locals import *
from math import pi, sin, cos

pygame.init()
# 获取显示器大小
screen_width, screen_height = pygame.display.get_desktop_sizes()[0]

ICON = "./icon.png"
TITLE = "见到你时我的心"
WIDTH = 800
HEIGHT = 800
main_loops = True
# 心形中心点
center_x = screen_width / 2
center_y = screen_height / 2
#
screen = pygame.display.set_mode((screen_width, screen_height), pygame.FULLSCREEN)
pygame.display.set_caption(TITLE)
pygame.mouse.set_visible(False)
try:
    pygame.display.set_icon(pygame.image.load(ICON))
except:
    pass



bottomlefttip_h = "[f:全屏/窗口][s:闪烁][t:跳动][+/-:频率][esc:退出]: "
bottomlefttip = bottomlefttip_h
bottomrighttip_h = "[鼠标位置]: "
bottomrighttip = bottomrighttip_h
HOT_PINK = (255,105,180)

class Particle():
    def __init__(self, pos, size, f):
        # (left, top, width, height)
        self.pos = pos.copy()
        self.pos0 = pos.copy()
        self.size = size
        self.f = f

    def draw(self, center_x, center_y):
        """
        Rect((left, top), (width, height)) -> Rect
        :return:
        """

        pygame.draw.rect(screen, HOT_PINK,
                         pygame.Rect((self.size * self.f * self.pos[0] + center_x, -self.size * self.f * self.pos[1] + center_y),
                            (self.pos[2], self.pos[3])),
                         0)

    def update(self, t):
        # 全部一个呼吸系数
        # df = 1 + (2 - 1.5 ) * sin(t * 3) / 8
        # df = 1 +  (heartbeatmplitude )*sin(t * 3) / 8

        # 外内,内快,参数外小内大
        df = 1 + (2 - 1.5 * self.f) * sin(t * 3) / 8
        self.pos[0] = self.pos0[0] * df
        self.pos[1] = self.pos0[1] * df


class MouseParticle():

    def __init__(self, pos):
        # (left, top, width, height)
        self.pos = pos.copy()
        self.particles = []
        self.xiaoshishudu = .8
        self.xiaoshishuduxishu = 1.2

        self.show = .5
        no_p = 50
        # dt 离散点数
        dt = 2 * pi / no_p
        t = 0
        while t <= 2 * pi:
            # 正向随机分面
            l = mu - abs(random.gauss(mu, sigma) - mu)
            # 双向分布
            # l=random.gauss(mu, sigma)
            # l=1,表示画一个线
            # l=1

            xleft = l * 16 * sin(t) ** 3
            ytop = l * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
            t += dt
            self.particles.append(Particle([xleft, ytop, static_wh[0], static_wh[1]], 1, l))

    def draw(self):
        """
        Rect((left, top), (width, height)) -> Rect
        :return:
        """
        if not self.show:
            return
        if self.xiaoshishudu < 0.000005:
            self.show = 0

        for p in self.particles:
            p.draw(self.pos[0], self.pos[1])

        self.update()

    def update(self):
        self.xiaoshishudu = self.xiaoshishudu ** self.xiaoshishuduxishu
        for p in self.particles:
            p.update(self.xiaoshishudu)

    def jiashudu(self):
        if self.xiaoshishuduxishu < 3:
            self.xiaoshishuduxishu += .1

    def jianshudu(self):
        if self.xiaoshishuduxishu > 1.1:
            self.xiaoshishuduxishu -= .1


mouseParticleList = []

particles = []

"""
若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)
期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布

心形公式
    x=16*sin(t)**3
    y=13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)
"""
# 均值,心形的大小
mu = 1.1
# 是标准差,辐射范围
sigma = .15

# 静态心形点的大小
static_wh = (1.5, 1.5)
# 动态心形点大小,
dynamic_wh = (1, 2)
# 心跳幅度
heartbeatmplitude = 1.2

# 心形大小
size = 15

# 外部开关
waiweikaiguan = True
# 跳动开关
tiaodongkaiguan = True
# 窗口,全屏
fullscreenkaiguan = False
# 跳动频率
jumpfreq=30

no_p = 10000
# dt 离散点数
dt = 2 * pi / no_p
t = 0

#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 3万个点

def init_dynamic_particles():
    # dt 离散点数
    global t
    # 初始化跳动心形点
    while t <= 2 * pi:
        # 正向随机分面
        l = mu - abs(random.gauss(mu, sigma) - mu)
        # 双向分布
        # l=random.gauss(mu, sigma)
        # l=1,表示画一个线
        # l=1

        xleft = l * 16 * sin(t) ** 3
        ytop = l * (13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
        t += dt
        particles.append(Particle([xleft, ytop, static_wh[0], static_wh[1]], size, l))


# def draw():
#     screen.clear()
#     for i in range(len(x)):
#         screen.draw.filled_rect(Rect((x[i]*10+center_x, -y[i]*10+center_y), (4, 4)), 'pink')

def show_ynamic_particles():
    for p in particles:
        p.draw(center_x, center_y)


def show_static_particles():
    # 3万个点
    # no_p = 20000
    # dt 离散点数
    t = 0
    while waiweikaiguan and t < 2 * pi:
        f = random.gauss(mu, sigma * 2)
        x = 16 * sin(t) ** 3
        y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)
        # unifORM成下一个实数,它在 [x,y] 范围内
        pygame.draw.rect(screen, HOT_PINK,
                         Rect((17 * f * x + center_x, -17 * f * y + center_y), (random.uniform(.5, 3), random.uniform(.5, 3))),
                         0
                         )
        # screen.draw.filled_rect(
        #     Rect((17 * f * x + center_x, -17 * f * y + center_y), (random.uniform(.5, 3), random.uniform(.5, 3))),
        #     'hot pink')
        t += dt * 2


def show_mouse_particles():
    global mouseParticleList
    t = []
    for p in mouseParticleList:
        if p.show:
            t.append(p)
            p.draw()
        else:
            break
    mouseParticleList = t


def add_mouse_particles(pos):
    global mouseParticleList
    mouseParticleList = [MouseParticle(pos)] + mouseParticleList


def draw_text(sc, str, position, pos:tuple , color, background="black", fontsize=24, name=None):
    text = pygame.font.SysFont(name, fontsize).render(str, True, color, background)
    textRect = text.get_rect()
    if position.startswith("c"):
        textRect.center = pos
    elif position.startswith("m"):
        pass
    elif position.startswith("bottomleft"):
        textRect.bottomleft=pos
    elif position.startswith("bottomright"):
        textRect.bottomright=pos
    elif position.startswith("topleft"):
        textRect.topleft=pos
    elif position.startswith("topright"):
        textRect.topright=pos
    else:
        try:
            raise AttributeError("position")  # 假装这里有异常,一般针对难以复现的异常
        except:
            print("""postion
                    # bottomleft=(100, 100)
                    # topleft=(100, 100)
                    # topright=(100, 100)
                    # bottomright=(100, 100)
                    #
                    # midtop=(100, 100)
                    # midleft=(100, 100)
                    # midbottom=(100, 100)
                    # midright=(100, 100)
                    # center=(100, 100)""")

    sc.blit(text, textRect)

    # bottomleft=(100, 100)
    # topleft=(100, 100)
    # topright=(100, 100)
    # bottomright=(100, 100)
    #
    # midtop=(100, 100)
    # midleft=(100, 100)
    # midbottom=(100, 100)
    # midright=(100, 100)
    # center=(100, 100)
    # centerx
    # centery

def draw():
    # 清空全部内容
    screen.fill("black")

    draw_text(screen, "心动", "center", (center_x, center_y), HOT_PINK, "black", 24, "SimSun")
    draw_text(screen, bottomlefttip, "bottomleft", (0, center_y * 2), HOT_PINK, "black", 12, "SimSun")
    draw_text(screen, bottomrighttip, "bottomright", (center_x * 2, center_y * 2), HOT_PINK, "black", 12, "SimSun")

    # 显示动态心形
    show_ynamic_particles()
    """
        初始化外部心形情况
    """
    show_static_particles()
    # 显示鼠标
    show_mouse_particles()
    """
        screen.draw.text("ccccccccc\nbbbbbbbbb", center=(100, 100), color='hot pink', background="black", fontsize=24)
        screen.draw.text("1", bottomleft=(100, 100), color=(200, 200, 200), background="black")
        screen.draw.text("2", topleft=(100, 100), color=(200, 200, 200), background="black")
        screen.draw.text("3", topright=(100, 100), color=(200, 200, 200), background="black")
        screen.draw.text("4", bottomright=(100, 100), color=(200, 200, 200), background="black")

        screen.draw.text("5", midtop=(100, 100), color=(200, 200, 200), background="black")
        screen.draw.text("6", midleft=(100, 100), color=(200, 200, 200), background="black")
        screen.draw.text("7", midbottom=(100, 100), color=(200, 200, 200), background="black")
        screen.draw.text("8", midright=(100, 100), color=(200, 200, 200), background="black")
    """
    #刷新一下画面,将画的东西显示到画面上
    pygame.display.update()


def update(dt):
    # dt 1/fps 两帧之间的时间间隔 单位是秒
    global t
    t += dt
    if tiaodongkaiguan:
        for p in particles:
            p.update(t)

# 加载背景音乐
def musicloops(path):
    pygame.mixer.init()
    try:
        pygame.mixer.music.load(path)
        pygame.mixer.music.play(-1)
    except:
        pass


def on_mouse_down(pos, button):
    # print(pos, button)
    global bottomrighttip
    bottomrighttip = bottomrighttip_h + str(pos) + str(button)

def on_mouse_up(pos, button):
    pass

def on_mouse_move(pos, rel, buttons):
    # print(pos, rel, buttons)
    global bottomrighttip
    bottomrighttip = bottomrighttip_h + str(pos)
    # 更新状态
    add_mouse_particles([pos[0], pos[1]])


def on_key_down(key):
    global screen
    global bottomlefttip, fullscreenkaiguan, waiweikaiguan, tiaodongkaiguan
    bottomlefttip = bottomlefttip_h + pygame.key.name(key)
    global center_x, center_y
    global jumpfreq

    if key == K_f:
        if fullscreenkaiguan:
            # screen =
            pygame.display.set_mode((WIDTH, HEIGHT), pygame.RESIZABLE)
            # 发现从pygame.FULLSCREEN,到pygame.RESIZABLE调用一次不起作用
            pygame.display.set_mode((WIDTH, HEIGHT), pygame.RESIZABLE)
            center_x = WIDTH / 2
            center_y = HEIGHT / 2
            pass
            pygame.mouse.set_visible(True )
        else:
            # pygame.display.set_mode((screen_width, screen_height), pygame.NOFRAME)
            # screen =
            pygame.display.set_mode((screen_width, screen_height), pygame.FULLSCREEN)
            pygame.display.set_mode((screen_width, screen_height), pygame.FULLSCREEN)
            center_x = screen_width / 2
            center_y = screen_height / 2
            pygame.mouse.set_visible(False)
        # , pygame.NOFRAME
        fullscreenkaiguan = not fullscreenkaiguan
        bottomlefttip += " 全屏"+str(fullscreenkaiguan)
    elif key == K_ESCAPE:
        global main_loops
        main_loops=False
    elif key == K_SPACE:
        pass
    elif key == K_s:
        waiweikaiguan = not waiweikaiguan
        bottomlefttip += " 闪烁"+str(waiweikaiguan)

    elif key == K_t:
        tiaodongkaiguan = not tiaodongkaiguan
        bottomlefttip += " 跳动"+str(tiaodongkaiguan)

    elif key == K_KP_PLUS or key == K_PLUS:
        if jumpfreq>5:
            jumpfreq-=5
        bottomlefttip += " 频率=" + str(jumpfreq)
    elif key == K_KP_MINUS or key == K_MINUS:
        if jumpfreq<60:
            jumpfreq+=5
        bottomlefttip += " 频率=" + str(jumpfreq)
    elif key == K_MENU:
        pass
    else:
        bottomlefttip += " 无动作 "

# pgzrun.Go()


def event():
    global center_x, center_y

    for event in pygame.event.get():

        # if event.type not in [KEYDOWN, MOUSEMOTION, MOUSEBUTTONDOWN, MOUSEBUTTONUP]:
        #     print(event)


        if event.type == QUIT:
            global main_loops
            main_loops = False

        elif event.type == KEYDOWN:
        # 键盘被按下 unicode 、key 、mod
            on_key_down(event.key)
        # https://blog.csdn.net/qq_41556318/article/details/86304649
        # Http://t.zoukankan.com/liquancai-p-13235734.html
        elif event.type == MOUSEMOTION:
        # MOUSEMOTION 鼠标移动  pos 、rel 、buttons
        # <Event(1024-MouseMotion {'pos': (289, 464), 'rel': (2, -5), 'buttons': (0, 0, 0), 'touch': False, 'window': None})>
            on_mouse_move(event.pos, event.rel, event.buttons)
        elif event.type == MOUSEBUTTONDOWN:
        # MOUSEBUTTONDOWN 鼠标被按下pos 、button
        # <Event(1025-MouseButtonDown {'pos': (289, 464), 'button': 1, 'touch': False, 'window': None})>
            on_mouse_down(event.pos, event.button)
        elif event.type == MOUSEBUTTONUP:
        # MOUSEBUTTONUP鼠标被放开pos 、button
            on_mouse_up(event.pos, event.button)

        elif event.type == VIDEORESIZE:
            center_x = event.w / 2
            center_y = event.h / 2

        elif event.type == WINDOWMAXIMIZED:
            # 窗口最大化
            print(event)
        elif event.type == WINDOWMINIMIZED:
            # 窗口最大化
            print(event)
            pygame.mixer.music.pause()
        elif event.type == WINDOWRESTORED:
            # 重新显示
            pygame.mixer.music.unpause()
        elif event.type == windowsHOWN:
            print(event)

        elif event.type == ACTIVEEVENT:
            # print(pygame.mixer.music.get_busy())
            # try:
            #     if event.gain and not pygame.mixer.music.get_busy():
            #         #显示内容
            #         pygame.mixer.music.pause()
            #     elif not event.gain and pygame.mixer.music.get_busy():
            #         pygame.mixer.music.pause()
            # except:
            #     pass
            pass

if __name__ == '__main__':
    musicloops("bfa.mp3")
    # 初始化动态心形点,只执行一次
    init_dynamic_particles()

    # Run the game loop.
    while main_loops:
        event()
        update(1/jumpfreq)
        draw()

    pygame.quit()

# pyinstaller -F -c -w -i favicon.ico --clean xx-pygame.py
# cxfreeze xg.py --target-dir x --base-name=win32gui

2、编译

1)新建一个虚拟环境安装pygame,pyinstaller两个库

2)使用pyinstaller打包

说明一下,pyinstaller打包,会加载环境里的全部内容,所以需要单独新建环境,这样在dist生成的exe文件会比较小。

pyinstaller 参数和使用说明可以参考:使用Pyinstaller打包exe文件详细图文教程

不用看.spec文件格式,用不到。

3)生成结果

说明:运行程序是没有窗口图标和声音的,需要dist中放一个bfa.mp3.这个是在465行。可以修改成自己的内容。

2.有了可运行程序,使用RAR压缩工具将资源和程序打包成独立可执行exe

1)将声音,图标,python打包生成的exe 打成一个rar

2)打开 dist.rar ,工具拦选择“自解压格式”

完成以上配置后选确定,两次。这时在目录下会生成 dist.exe。这时可以运行查下一下效果。

3.将dist.exe配置成系统屏幕保护

1)将dist.exe 修改成 dist.scr 复制到 C:\Windows目录下双击运行

2)回到电脑桌面,鼠标右击,选择个性化打开如下图:

到此这篇关于利用Python制作自已的动态屏保的文章就介绍到这了,更多相关Python动态屏保内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Python制作自已的动态屏保

本文链接: https://lsjlt.com/news/175388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 利用Python制作自已的动态屏保
    我的环境 win10 python3.X pycharm 1.编写自己的屏保程序 注意:屏保程序打开就是全屏,可自动循环播放 我的样子如图 1、代码准备 Gitee下载 impor...
    99+
    2022-12-20
    Python动态屏保 Python屏保
  • 如何使用Python制作自已的动态屏保
    这篇文章主要介绍“如何使用Python制作自已的动态屏保”,在日常操作中,相信很多人在如何使用Python制作自已的动态屏保问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Python制作自已的动态屏保...
    99+
    2023-07-04
  • 利用WPF实现Windows屏保的制作
    目录介绍正文实现代码介绍 框架使用.NET452; Visual Studio 2019; 项目使用 MIT 开源许可协议; 更多效果可以通过GitHub[1]|...
    99+
    2024-04-02
  • XP系统中如何制作动态屏幕保护
    这篇文章将为大家详细讲解有关XP系统中如何制作动态屏幕保护,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。动态屏幕保护的制作方法:打开软件,“常规”选项。如下图,主要设置“输出”项,就是输出路径和输出的格式...
    99+
    2023-06-13
  • Python利用matplotlib实现制作动态条形图
    目录制作思路animation大家好,本文将分享如何使用matplotlib制作动态条形图,制作的图很美,这个是我在之前发布的一篇中使用的图片, 效果如下 制作思路 为了方便大家学...
    99+
    2024-04-02
  • Python利用pynimate实现制作动态排序图
    数据可视化动画还在用 Excel 做?今天分享一个简单的 Python 包就能分分钟搞定! 而且生成的动画也足够丝滑,效果是酱紫的: 这是一位专攻 Python 语言的程序员开发的...
    99+
    2023-02-01
    Python制作动态排序图 Python动态排序图 Python动态排序
  • Python利用D3Blocks绘制可动态交互的图表
    目录热力图粒子图时间序列图桑基图小提琴图散点图弦图网络图今天小编给大家来介绍一款十分好用的可视化模块,D3Blocks,不仅可以用来绘制可动态交互的图表,并且导出的图表可以是HTML...
    99+
    2023-02-03
    Python D3Blocks绘制动态交互图表 Python绘制动态交互图表 Python 动态交互图表
  • 怎样用Python制作动态二维码
    这篇文章给大家介绍怎样用Python制作动态二维码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何做到用一行代码实现动态二维码的制作?用法比较简单,直接通过pip安装即可pip3 install ...
    99+
    2023-06-02
  • 如何利用python自动完成工作
    如何利用python自动完成工作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。没有什么能比学以致用让学习变得更有动力的了。不知道大家在工作中有没有一些工作需要重复的点击鼠标,因...
    99+
    2023-06-02
  • 利用Python实现无损GIF动图的制作
    目录生成gif图无损压缩先讲一讲整理的目标 1.挑选喜欢的照片用python制作GIF图 2.动图太大了,对它无损压缩 生成gif图 调用python库imageio可以轻松实现 读...
    99+
    2023-05-15
    Python制作无损GIF动图 Python制作无损GIF Python 无损GIF Python GIF
  • Python制作动态字符画的源码
    字符画,一种由字母、标点、汉字或其他字符组成的图画。简单的字符画是利用字符的形状代替图画的线条来构成简单的人物、事物等形象,它一般由人工制作而成;复杂的字符画通常利用占用不同数量像素...
    99+
    2024-04-02
  • 用Python制作一个动态爱心效果!
    大家好,我是小F~ 最近「点燃我,温暖你」这部剧非常火,讲述的是程序员的爱情故事。 其中陈飞宇饰演的男主李峋,在剧中用程序做出的爱心跳动效果,非常炫。 网上各个大佬也是纷纷给出看法,综合就是不太可能用C语言来实现的。 大概率...
    99+
    2023-09-10
    python 开发语言
  • 如何利用 Python 绘制动态可视化图表
    目录一、安装相关的模块二、gif和matplotlib的结合三、gif和plotly的结合四、matplotlib多子图动态可视化五、动态气泡图一、安装相关的模块 首先第一步的话我们...
    99+
    2024-04-02
  • Python如何利用D3Blocks绘制可动态交互的图表
    本篇内容主要讲解“Python如何利用D3Blocks绘制可动态交互的图表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何利用D3Blocks绘制可动态交互的图表”吧!热力图热力图...
    99+
    2023-07-05
  • 如何使用Python代码制作动态鞭炮
    这篇文章给大家分享的是有关如何使用Python代码制作动态鞭炮的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果如下所示:动态鞭炮的基本原理是:将一个录制好的鞭炮视频以字符画的形式复现,基本步骤是帧采样 &...
    99+
    2023-06-28
  • 利用SpringDataJPA开启审计功能,自动保存操作人操作时间
    目录1 相关注解实现自动记录上述信息主要有5个注解2 实现过程2.1 依赖引用2.2 实体类标记审计属性2.3 审计自定义操作2.4 应用开启审计功能2.5 实体操作有些业务数据对数...
    99+
    2024-04-02
  • Python利用cv2动态绘制圆和矩形的示例详解
    新手,参考了以下链接: python opencv在图像上画矩形(已验证) 本文可以实现在指定图片上动态绘制圆和矩形。 import cv2 import numpy as np i...
    99+
    2023-03-23
    Python cv2绘制圆 矩形 Python cv2绘制圆 Python cv2绘制矩形 Python cv2
  • Python 使用PIL.Image制作运动小人的动态图思路详解
    准备材料: 图片img.png 大小:804x165 制作思路: 把图片拆分成12等分,每帧大小:67x165;连续读取和播放就会形成动态图像。 源代码: import tki...
    99+
    2024-04-02
  • 为了顺利买到演唱会的票用Python制作了自动抢票的脚本
    目录知识点:开发环境:先导入本次所需的模块第一步,实现免登录确定目标,设置全局变量初始化加载登录调用设置cookie获取cookie登录打开浏览器第二步,抢票并下单判断元素是否存在选...
    99+
    2024-04-02
  • Python编程使用PyQt5制作动态钟表示例
    目录前言环境配置实现思路老式钟表制作电子表制作合并两表界面核心代码总结前言 大家好,我是小张~ 记得小时候,家里只有一个钟表用来看时间(含有时针、分针、秒针的那种),挂在墙上哒哒哒响...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作