桌面太单调?一起用Python做个自定义动态壁纸,竟然还可以放视频!_pyqt5漂亮界面动态背景


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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值