利用Python制作自已的動態(tài)屏保
我的環(huán)境
win10
python3.X
pycharm
1.編寫自己的屏保程序
注意:屏保程序打開就是全屏,可自動循環(huán)播放
我的樣子如圖

1、代碼準備
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):
# 全部一個呼吸系數(shù)
# df = 1 + (2 - 1.5 ) * sin(t * 3) / 8
# df = 1 + (heartbeatmplitude )*sin(t * 3) / 8
# 外內,內快,參數(shù)外小內大
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 離散點數(shù)
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服從一個數(shù)學期望為μ、方差為σ^2的正態(tài)分布,記為N(μ,σ^2)
期望值μ決定了其位置,其標準差σ決定了分布的幅度。當μ = 0,σ = 1時的正態(tài)分布是標準正態(tài)分布
心形公式
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
# 靜態(tài)心形點的大小
static_wh = (1.5, 1.5)
# 動態(tài)心形點大小,
dynamic_wh = (1, 2)
# 心跳幅度
heartbeatmplitude = 1.2
# 心形大小
size = 15
# 外部開關
waiweikaiguan = True
# 跳動開關
tiaodongkaiguan = True
# 窗口,全屏
fullscreenkaiguan = False
# 跳動頻率
jumpfreq=30
no_p = 10000
# dt 離散點數(shù)
dt = 2 * pi / no_p
t = 0
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 3萬個點
def init_dynamic_particles():
# dt 離散點數(shù)
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 離散點數(shù)
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成下一個實數(shù),它在 [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") # 假裝這里有異常,一般針對難以復現(xiàn)的異常
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")
# 顯示動態(tài)心形
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)
# 更新狀態(tài)
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)
# 發(fā)現(xiàn)從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")
# 初始化動態(tài)心形點,只執(zhí)行一次
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)新建一個虛擬環(huán)境安裝pygame,pyinstaller兩個庫

2)使用pyinstaller打包
說明一下,pyinstaller打包,會加載環(huán)境里的全部內容,所以需要單獨新建環(huán)境,這樣在dist生成的exe文件會比較小。
pyinstaller 參數(shù)和使用說明可以參考:使用Pyinstaller打包exe文件詳細圖文教程
不用看.spec文件格式,用不到。

3)生成結果
說明:運行程序是沒有窗口圖標和聲音的,需要dist中放一個bfa.mp3.這個是在465行??梢孕薷某勺约旱膬热?。

2.有了可運行程序,使用RAR壓縮工具將資源和程序打包成獨立可執(zhí)行exe
1)將聲音,圖標,python打包生成的exe 打成一個rar

2)打開 dist.rar ,工具攔選擇“自解壓格式”





完成以上配置后選確定,兩次。這時在目錄下會生成 dist.exe。這時可以運行查下一下效果。

3.將dist.exe配置成系統(tǒng)屏幕保護
1)將dist.exe 修改成 dist.scr 復制到 C:\Windows目錄下雙擊運行
2)回到電腦桌面,鼠標右擊,選擇個性化打開如下圖:

到此這篇關于利用Python制作自已的動態(tài)屏保的文章就介紹到這了,更多相關Python動態(tài)屏保內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
利用For循環(huán)遍歷Python字典的三種方法實例
字典由多個鍵和其對應的值構成的鍵—值對組成,鍵和值中間以冒號:隔開,項之間用逗號隔開,整個字典是由大括號{}括起來的,下面這篇文章主要給大家介紹了關于如何利用For循環(huán)遍歷Python字典的三種方法,需要的朋友可以參考下2022-03-03
Python3安裝模塊報錯Microsoft Visual C++ 14.0 is required的解決方法
這篇文章主要介紹了Python3安裝模塊報錯Microsoft Visual C++ 14.0 is required的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
python基于pyDes庫實現(xiàn)des加密的方法
這篇文章主要介紹了python基于pyDes庫實現(xiàn)des加密的方法,結合實例形式較為詳細的分析了pyDes庫的下載、安裝及使用pyDes庫進行加密的相關操作技巧,需要的朋友可以參考下2017-04-04
刪除DataFrame中值全為NaN或者包含有NaN的列或行方法
今天小編就為大家分享一篇刪除DataFrame中值全為NaN或者包含有NaN的列或行方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11

