午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙

瀏覽:2日期:2022-08-06 17:26:59
目錄使用Python做個(gè)自定義動(dòng)態(tài)壁紙一、核心功能設(shè)計(jì)二、實(shí)現(xiàn)步驟1. UI排版布局設(shè)計(jì)2. 視頻加載預(yù)覽3. 動(dòng)態(tài)壁紙功能實(shí)現(xiàn)4. 關(guān)閉動(dòng)態(tài)壁紙使用Python做個(gè)自定義動(dòng)態(tài)壁紙

首先一起來(lái)看看最終實(shí)現(xiàn)的自定義動(dòng)態(tài)壁紙效果:

如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙接我

接下來(lái),我們開(kāi)始介紹這個(gè)自定義動(dòng)態(tài)桌面的制作過(guò)程。

一、核心功能設(shè)計(jì)

總體來(lái)說(shuō),我們需要實(shí)現(xiàn)將自己喜歡的視頻轉(zhuǎn)成一個(gè)動(dòng)態(tài)桌面,知識(shí)點(diǎn)主要包含了對(duì)視頻提取解析視頻輪播PyQt5窗體設(shè)置桌面句柄獲取自定義動(dòng)態(tài)桌面壁紙實(shí)現(xiàn)等。

大致可以整理出我們需要分為以下幾步完成:

UI排版布局設(shè)計(jì),確認(rèn)動(dòng)態(tài)壁紙功能設(shè)計(jì) 加載視頻,對(duì)視頻進(jìn)行預(yù)覽讀取,保存視頻路徑等 動(dòng)態(tài)壁紙功能實(shí)現(xiàn)應(yīng)用,獲取桌面句柄,輪播加載視頻 關(guān)閉動(dòng)態(tài)壁紙,在線壁紙資源獲取等二、實(shí)現(xiàn)步驟

之前有粉絲反饋說(shuō),想自己跟著文章自己敲敲代碼,但是不知道具體需要哪些模塊、包文件,后面我就把所有用到模塊先放出來(lái)。

import osimport sysfrom subprocess import callfrom threading import Threadfrom time import sleepimport cv2from PyQt5 import QtCore, QtWidgetsfrom PyQt5.QtCore import Qt, QTimerfrom PyQt5.QtGui import QImage, QPixmap, QIconfrom PyQt5.QtWidgets import QGridLayout, QPushButton, QMainWindow, QFileDialog, QLabel, QSystemTrayIcon, QAction, QMenu, QMessageBoxfrom os import path as pathq1. UI排版布局設(shè)計(jì)

根據(jù)動(dòng)態(tài)壁紙所需要的功能,首先進(jìn)行UI布局設(shè)計(jì),我們這次還是使用的pyqt5。主要包含了加載讀取本地視頻、視頻加載預(yù)覽、動(dòng)態(tài)壁紙應(yīng)用、動(dòng)態(tài)壁紙關(guān)閉等。核心設(shè)計(jì)代碼如下:

# author:Dragon少年def setupUi(self, MainWindow): MainWindow.setObjectName('MainWindow') MainWindow.resize(505, 615) MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName('centralwidget') self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(22, 10, 89, 31)) self.pushButton.setObjectName('pushButton') self.pushButton.clicked.connect(self.openmp4) self.pushButton.setStyleSheet(’’’QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}’’’) self.groupBox = QtWidgets.QGroupBox(self.centralwidget) self.groupBox.setGeometry(QtCore.QRect(22, 50, 452, 351)) self.groupBox.setObjectName('groupBox') self.widget = QtWidgets.QWidget(self.groupBox) self.widget.setGeometry(QtCore.QRect(11, 20, 430, 291)) self.widget.setObjectName('widget') self.gridLayout_3 = QtWidgets.QGridLayout(self.widget) self.gridLayout_3.setObjectName('gridLayout_3') self.label = QLabel(self) self.label.resize(400, 300) self.label.setText('Waiting for video...') self.gridLayout_3.addWidget(self.label) self.close_widget = QtWidgets.QWidget(self.centralwidget) self.close_widget.setGeometry(QtCore.QRect(420, 0, 93, 41)) self.close_widget.setObjectName('close_widget') self.close_layout = QGridLayout() # 創(chuàng)建左側(cè)部件的網(wǎng)格布局層 self.close_widget.setLayout(self.close_layout) # 設(shè)置左側(cè)部件布局為網(wǎng)格 self.left_close = QPushButton('') # 關(guān)閉按鈕 self.left_close.clicked.connect(self.close) self.left_visit = QPushButton('') # 空白按鈕 #self.left_visit.clicked.connect(MainWindow.big) self.left_mini = QPushButton('') # 最小化按鈕 self.left_mini.clicked.connect(MainWindow.mini) self.close_layout.addWidget(self.left_mini, 0, 0, 1, 1) self.close_layout.addWidget(self.left_close, 0, 2, 1, 1) self.close_layout.addWidget(self.left_visit, 0, 1, 1, 1) self.left_close.setFixedSize(15, 15) # 設(shè)置關(guān)閉按鈕的大小 self.left_visit.setFixedSize(15, 15) # 設(shè)置按鈕大小 self.left_mini.setFixedSize(15, 15) # 設(shè)置最小化按鈕大小 self.left_close.setStyleSheet(’’’QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}’’’) self.left_visit.setStyleSheet(’’’QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}’’’) self.left_mini.setStyleSheet(’’’QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}’’’) self.horizontalLayout = QtWidgets.QHBoxLayout(self.close_widget) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName('horizontalLayout') self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(77, 440, 133, 41)) self.pushButton_2.setObjectName('pushButton_2') self.pushButton_2.clicked.connect(self.play) self.pushButton_2.setStyleSheet(’’’QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}’’’) self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(308, 440, 111, 41)) self.pushButton_3.setObjectName('pushButton_3') self.pushButton_3.clicked.connect(self.close_wall) self.pushButton_3.setStyleSheet(’’’QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}’’’) self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_4.setGeometry(QtCore.QRect(187, 540, 133, 21)) self.pushButton_4.setObjectName('pushButton_4') self.pushButton_4.clicked.connect(self.openurl) self.pushButton_4.setStyleSheet(’’’QPushButton{background:#222225;color:white;border-radius:5px;}QPushButton:hover{background:#222225;color:skyblue}’’’) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 505, 23)) self.menubar.setObjectName('menubar') MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName('statusbar') MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.groupBox.setStyleSheet(’’’ color:white ’’’) MainWindow.setWindowOpacity(0.95) # 設(shè)置窗口透明度 MainWindow.setAttribute(Qt.WA_TranslucentBackground) MainWindow.setWindowFlag(Qt.FramelessWindowHint) # 隱藏邊框# author:Dragon少年def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate('MainWindow', 'MainWindow')) self.pushButton.setText(_translate('MainWindow', '從本地選擇')) self.groupBox.setTitle(_translate('MainWindow', '預(yù)覽')) self.pushButton_2.setText(_translate('MainWindow', '應(yīng)用')) self.pushButton_3.setText(_translate('MainWindow', '關(guān)閉壁紙')) self.pushButton_4.setText(_translate('MainWindow', '在線資源'))

UI實(shí)現(xiàn)效果如下:

如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙

UI布局設(shè)計(jì)完成,下面我們開(kāi)始進(jìn)行視頻讀取加載、預(yù)覽功能實(shí)現(xiàn)。

2. 視頻加載預(yù)覽

接來(lái)下我們可以根據(jù)自己喜歡的視頻,從本地讀取視頻,并且將視頻預(yù)覽播放顯示。這里視頻演示,博主還是用之前的那篇紫顏小姐姐的跳舞視頻進(jìn)行演示。

讀取視頻:

讀取視頻我們可以通過(guò)打開(kāi)文件對(duì)話框,選擇視頻資源,開(kāi)啟一個(gè)子線程用來(lái)進(jìn)行視頻開(kāi)啟停止播放。核心代碼如下:

# author:Dragon少年def openmp4(self): try:global pathpath, filetype = QFileDialog.getOpenFileName(None, '選擇文件', ’.’, '視頻文件(*.AVI;*.mov;*.rmvb;*.rm;*.FLV;*.mp4;*.3GP)') # ;;All Files (*)if path == '': # 未選擇文件 returnself.slotStart()t = Thread(target=self.Stop)t.start() # 啟動(dòng)線程,即讓線程開(kāi)始執(zhí)行 except Exception as e:print (e)

視頻流讀取播放:

接下來(lái),我們需要對(duì)視頻文件進(jìn)行按幀讀取加載顯示,并通過(guò)計(jì)時(shí)器實(shí)現(xiàn)動(dòng)畫效果。核心代碼如下:

# author: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: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:# 檢測(cè)代碼self.frameself.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() # 停止計(jì)時(shí)器

至此,我們已經(jīng)可以實(shí)現(xiàn)視頻讀取加載,并且進(jìn)行視頻預(yù)覽了,效果如下:

如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙

3. 動(dòng)態(tài)壁紙功能實(shí)現(xiàn)

實(shí)現(xiàn)桌面壁紙?zhí)鎿Q,我們首先需要獲取桌面句柄找到桌面窗體,覆寫桌面窗體、調(diào)用加載的視頻流,播放動(dòng)態(tài)壁紙。

獲取桌面句柄:

# author: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: continuehView = win32gui.FindWindowEx(hwnd_WorkW, None, 'SHELLDLL_DefView', None)# print(’hwmd_hView: ’, hView)if not hView: continueh = 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

桌面覆寫:

我們可以創(chuàng)建一個(gè)類,對(duì)窗體進(jìn)行繼承,進(jìn)行視頻流加載讀取播放。核心代碼如下:

# author: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: 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文件,接下來(lái)我們?cè)凇皯?yīng)用”控件上進(jìn)行事件綁定,直接調(diào)用exe執(zhí)行,實(shí)現(xiàn)動(dòng)態(tài)壁紙播放應(yīng)用功能。核心代碼如下:

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() # 停止計(jì)時(shí)器 else: Warming = QMessageBox.warning(self, 'Warming', 'Push the left upper corner button to Quit.', QMessageBox.Yes) except: pass

這樣,我們就完成了動(dòng)態(tài)壁紙加載應(yīng)用功能了,效果如下:

如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙

4. 關(guān)閉動(dòng)態(tài)壁紙

最后我們?cè)賹?shí)現(xiàn)下當(dāng)前動(dòng)態(tài)壁紙播放關(guān)閉功能,我們需要對(duì)當(dāng)前桌面視頻播放進(jìn)行釋放取消。代碼如下:

# author:Dragon少年 def close_wall(self): try: call(’taskkill /F /IM play.exe’) except: pass

效果如下:

如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙

至此,整個(gè)自定義動(dòng)態(tài)桌面壁紙功能就全部完成了,下面我們一起運(yùn)行下看看動(dòng)態(tài)壁紙效果。

到此這篇關(guān)于使用Python做個(gè)自定義動(dòng)態(tài)壁紙的文章就介紹到這了,更多相關(guān)Python做動(dòng)態(tài)壁紙內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: av黄页| 网友自拍av | 在线看片亚洲 | 先锋久久 | 国产精品久久久久久久久免费 | 在线中文av | 日韩欧美中文字幕一区二区 | 久久久久久99 | 99热99re6国产在线播放 | 手机看片日韩 | 一级黄色在线 | 青青青视频在线免费观看 | 欧美成人免费 | 久久精品天堂 | 国产67194| 亚洲午夜视频 | 天天色天天射天天干 | 久久久久网 | 中文字幕精品视频在线观看 | 国产精品2019 | 四虎免费av | 天天曰天天操 | 亚洲精品aⅴ中文字幕乱码 亚洲精品视频在线 | 日本成人中文字幕 | 国产精品网站在线 | 成人国产片女人爽到高潮 | 亚洲日日日 | 97色在线视频 | 伊人网在线播放 | 亚洲视频一区二区 | 精品99在线 | 国内激情视频 | 亚洲白浆| 手机在线观看av | 免费在线中文字幕 | 玖玖国产 | 精品国产乱码久久久久久久 | 精品一区二区三区四区五区 | 最新中文字幕在线视频 | 国产91在线播放 | 朝桐光av一区二区三区 |