UI实现效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/cca0fe687ba74af4afed4fa31c213894.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_Q1NETiBARHJhZ29u5bCR5bm0,size_15,color_FFFFFF,t_70,g_se,x_16)
UI布局设计完成,下面我们开始进行视频读取加载、预览功能实现。
##### 2. 视频加载预览
接来下我们可以根据自己喜欢的视频,从本地读取视频,并且将视频预览播放显示。这里视频演示,博主还是用之前的那篇[紫颜小姐姐的跳舞视频]( )进行演示。
**读取视频:**
读取视频我们可以通过打开文件对话框,选择视频资源,开启一个子线程用来进行视频开启停止播放。核心代码如下:
author: CSDN-Dragon少年
def openmp4(self):
try:
global path
path, filetype = QFileDialog.getOpenFileName(None, “选择文件”, ‘.’,
“视频文件(*.AVI;*.mov;*.rmvb;*.rm;*.FLV;*.mp4;*.3GP)”) # ;;All Files (*)
if path == “”: # 未选择文件
return
self.slotStart()
t = Thread(target=self.Stop)
t.start() # 启动线程,即让线程开始执行
except Exception as e:
print (e)
**视频流读取播放:**
接下来,我们需要对视频文件进行按帧读取加载显示,并通过计时器实现动画效果。核心代码如下:
author:CSDN-Dragon少年
def slotStart(self):
videoName = path
if videoName != “”: # “”为用户取消
self.cap = cv2.VideoCapture(videoName)
self.timer_camera.start(50)
self.timer_camera.timeout.connect(self.openFrame)
author:CSDN-Dragon少年
def openFrame(self):
if (self.cap.isOpened()):
ret, self.frame = self.cap.read()
if ret:
frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
if self.detectFlag == True:
# 检测代码self.frame
self.label_num.setText(“There are " + str(5) + " people.”)
height, width, bytesPerComponent = frame.shape
bytesPerLine = bytesPerComponent * width
q_image = QImage(frame.data, width, height, bytesPerLine,
QImage.Format_RGB888).scaled(self.label.width(), self.label.height())
self.label.setPixmap(QPixmap.fromImage(q_image))
else:
self.cap.release()
self.timer_camera.stop() # 停止计时器
至此,我们已经可以实现视频读取加载,并且进行视频预览了,效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/c41bf90b5e744ded9934f79f40060742.gif)
##### 3. 动态壁纸功能实现
实现桌面壁纸替换,我们首先需要获取桌面句柄找到桌面窗体,覆写桌面窗体、调用加载的视频流,播放动态壁纸。
**获取桌面句柄:**
author:CSDN-Dragon少年
def pretreatmentHandle():
hwnd = win32gui.FindWindow(“Progman”, “Program Manager”)
win32gui.SendMessageTimeout(hwnd, 0x052C, 0, None, 0, 0x03E8)
hwnd_WorkW = None
while 1:
hwnd_WorkW = win32gui.FindWindowEx(None, hwnd_WorkW, “WorkerW”, None)
if not hwnd_WorkW:
continue
hView = win32gui.FindWindowEx(hwnd_WorkW, None, “SHELLDLL_DefView”, None)
# print('hwmd_hView: ', hView)
if not hView:
continue
h = win32gui.FindWindowEx(None, hwnd_WorkW, “WorkerW”, None)
while h:
win32gui.SendMessage(h, 0x0010, 0, 0) # WM_CLOSE
h = win32gui.FindWindowEx(None, hwnd_WorkW, “WorkerW”, None)
break
return hwnd
**桌面覆写:**
我们可以创建一个类,对窗体进行继承,进行视频流加载读取播放。核心代码如下:
author: CSDN-Dragon少年
class MyMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).init(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.player = QMediaPlayer()
self.player.setNotifyInterval(10000)
self.player.setVideoOutput(self.ui.videowidget)
self.player.setMuted(bool(1 - self.player.isMuted()))
self.setWindowFlags(Qt.FramelessWindowHint)
self.setupUi(self)
self.go()
# author: CSDN-Dragon少年
def go(self):
self.ui.videowidget.setFullScreen(True)
with open("./filename.txt", 'r', encoding='utf-8') as f:
file_name = f.read()
if file_name =='':
file_name = 'lkf.mp4'
print (file_name)
if not os.path.exists(file_name):
sys.exit()
media = QMediaContent(QUrl(file_name))
self.player.setMedia(media)
self.mplayList = QMediaPlaylist()
self.mplayList.addMedia(QMediaContent(QUrl.fromLocalFile(file_name)))
self.player.setPlaylist(self.mplayList)
self.mplayList.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
win_hwnd = int(self.winId())
video_h = int(self.ui.videowidget.winId())
win32gui.SetParent(win_hwnd, h)
win32gui.SetParent(video_h, h)
win32gui.SetParent(video_h, win_hwnd)
self.player.play()
这里我们把上面的py文件直接打包成exe文件,接下来我们在“应用”控件上进行事件绑定,直接调用exe执行,实现动态壁纸播放应用功能。核心代码如下:
author: CSDN-Dragon少年
def play(self):
if path == ‘’:
reply = QtWidgets.QMessageBox.question(self, ‘提示’,
“未加载选择视频”,
QtWidgets.QMessageBox.Yes)
return
with open(“./filename.txt”, ‘w’, encoding=‘utf-8’) as f:
f.truncate(0)
print(f.write(str(path)))
try:
try:
call(‘taskkill /F /IM play.exe’)
except:
pass
os.system(‘start play.exe’)
except:
pass
try:
if self.cap != []:
self.cap.release()
self.timer_camera.stop() # 停止计时器
else:
Warming = QMessageBox.warning(self, “Warming”, “Push the left upper corner button to Quit.”,
QMessageBox.Yes)
except:
pass
这样,我们就完成了动态壁纸加载应用功能了,效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/fb215f8c835342618775073b802e5e68.gif)
##### 4. 关闭动态壁纸
最后我们再实现下当前动态壁纸播放关闭功能,我们需要对当前桌面视频播放进行释放取消。代码如下:
author:CSDN-Dragon少年
def close_wall(self):
try:
call(‘taskkill /F /IM play.exe’)
except:
pass
效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/0761c4a6f0ed4c2ea7fb5c767bd2ae15.gif)
至此,整个自定义动态桌面壁纸功能就全部完成了,下面我们一起运行下看看动态壁纸效果。
**源码及数据已上传,关注文末公众号回复【源码】即可获取完整源码**
>
> Python往期精彩:
>
>
> * [见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频]( )
> * [python自制一款炫酷音乐播放器,想听啥随便搜!]( )
> * [斗地主老是输?一起用Python做个AI出牌器,豆子蹭蹭涨!]( )
> * [桌面太单调?一起用Python做个自定义动画挂件,好玩又有趣!]( )
> * [一起用Python做个车牌自动识别系统,好玩又实用!]( )
> * [桌面太单调?一起用Python做个自定义动态壁纸,竟然还可以放视频!]( )
> * [一起用Python做个自动化弹钢琴脚本,我竟然弹出了《天空之城》!]( )
> **往期精彩源码均可通过下方公众号获取**
>
>
**(1)Python所有方向的学习路线(新版)**
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/1f807758e039481fa866130abf71d796.png#pic_center)
**(2)Python学习视频**
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)
**(3)100多个练手项目**
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**