纯Python开发电脑桌面挂件,冰墩墩雪容融完美组合

桌面太单调?今天就带大家,一起用Python的PyQt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果

下面,我们开始介绍这个自定义桌面动画挂件的制作过程。

一、核心功能设计

实现将动态图gif或视频转成一个桌面动画挂件,知识点主要涉及了对gif图/视频解析,人像提取分割,PyQt5窗体设置,自定义挂件动画实现,ico图标生成,程序打包等。

拆解需求,大致可以整理出我们需要分为以下几步完成:

1.对gif或者视频进行逐帧解析,获取转换的图片提取图像中人体区域,并对图片进行批量尺寸大小修改替换

2.初始化设置动画挂件窗体显示效果,窗体位置、大小等

3.桌面动画挂件功能实现,动画轮播、鼠标控制挂件位置拖动

4.挂件打包图标设置、打包配置

二、实现步骤

干货主要有:

① 200 多本 Python 电子书(和经典的书籍)应该有

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且可靠的练手项目及源码)

④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

私信小编01即可获取大量Python学习资源

解析提取修改图片

gif图解析:

首先我们需要将Gif逐帧进行解析 ,转换成图片格式。代码如下:

from PIL import Image # 导入PIL的Image包

import os

gifFileName = "./demo.gif" # 把gif图赋值给gifFileName

im = Image.open(gifFileName) # 使用Image的open函数打开test.gif图

pngDir = gifFileName[:-4] # 倒着从gifFileName中的倒数第四个开始取字符(跳过.gif),赋值给pngDir,作为文件夹的名字

if not os.path.exists(pngDir):

os.makedirs('./img') # 用图片名创建一个文件夹,用来存放每帧图片,名字为pngDir的值

try:

while True: # 死循环

current = im.tell() # 用tell函数保存当前帧图片,赋值给current

im.save(pngDir+'/'+str(current+1)+'.png') # 调用save函数保存该帧图片

im.seek(current+1) # 调用seek函数获取下一帧图片,参数变为current帧图片+1

# 这里再次进入循环,当为最后一帧图片时,seek会抛出异常,代码执行except

except EOFError:

pass # 最后一帧时,seek抛出异常,进入这里,pass跳过

gif逐帧转为图片效果如下:

视频解析:

对视频解析,也是逐帧进行解析,转换成若干张图片代码如下:

# 将视频按照每一帧转成图片png

import cv2

videoFileName = "./demo.mp4" # 把视频路径赋值给videoFileName

pngDir = videoFileName[:-4] # 倒着从gifFileName中的倒数第四个开始取字符(跳过.后缀),赋值给pngDir,作为文件夹的名字

if not os.path.exists(pngDir):

os.makedirs(pngDir) # 用图片名创建一个文件夹,用来存放每帧图片,名字为pngDir的值

# 视频处理 分割成一帧帧图片

cap = cv2.VideoCapture(videoFileName)

num = 1

while True:

# 逐帧读取视频 按顺序保存到本地文件

ret, frame = cap.read()

if ret:

cv2.imwrite(f"{pngDir}/{num}.png", frame) # 保存一帧帧的图片

num += 1

else:

break

cap.release() # 释放资源

桌面小部件功能

初始化动画部件

# 窗体初始化

def windowinit(self):

self.x = 1650

self.y = 860

self.setGeometry(self.x, self.y, 300, 300)

self.setwindowTitle('My Gadgets')

self.img_num = 1

self.img_path = './image/{file}/{img}.png'.format(file=self.dis_file, img=str(self.img_num))

self.lab = QLabel(self)

self.qpixmap = Qpixmap(self.img_path)

self.lab.setpixmap(self.qpixmap)

self.setwindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)

self.setAutoFillBackground(False)

self.setAttribute(Qt.WA_TranslucentBackground, True)

self.show()

def __init__(self):

super(Gadgets, self).__init__()

self.dis_file = "img1"

self.windowinit()

self.icon_quit()

self.pos_first = self.pos()

self.img_count = len(os.listdir('./image/{}'.format(self.dis_file)))

这样只是完成了图片的静态显示,下面我们来完成图片的动态轮播效果

动画轮播:

self.timer = QTimer()

self.timer.timeout.connect(self.img_update)

self.timer.start(100)

def img_update(self):

if self.img_num < self.img_count:

self.img_num += 1

else:

self.img_num = 1

self.img_path = './image/{file}/{img}.png'.format(file=self.dis_file, img=str(self.img_num))

self.qpixmap = Qpixmap(self.img_path)

self.lab.setpixmap(self.qpixmap)

鼠标控制挂件位置拖动:

def mousepressEvent(self, QMouseEvent):

if QMouseEvent.button() == Qt.LeftButton:

self.pos_first = QMouseEvent.globalPos() - self.pos()

QMouseEvent.accept()

self.setCursor(QCursor(Qt.OpenHandCursor))

def mouseMoveEvent(self, QMouseEvent):

if Qt.LeftButton:

self.move(QMouseEvent.globalPos() - self.pos_first)

print(self.pos())

self.x, self.y = self.pos().x, self.pos().y

QMouseEvent.accept()

def quit(self):

self.close()

sys.exit()

到此为止,桌面小部件已开发完成,效果如下:

可以使用将程序打包为exe可执行文件直接发给你的朋友,这样就不用安装python环境了。

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...