1、Date 1.1 Date實例化 Date date1 = new Date(); System.out.println(date1); //Thu Jun 16 19:18:56 CST 2022 1.2 獲取日期毫秒數 getTime() System.out.println(date1.g ...
製作這個播放器的目的是為了將下載下來的mp3文件進行隨機或是順序的播放。選擇需要播放的音樂的路徑,選擇播放方式,經過測試可以完美的播放本地音樂。
在開始之前介紹一個免費下載mp3音樂的網站,有需要的可以下載自己喜歡的音樂。當然有各大音樂平臺會員的大佬就不需要了。
http://music.y444.cn/#/
缺少音樂素材的可以去免費下載即可,準備好音樂素材後將其放到一個文件夾下麵即可。
在應用實現過程中,總共使用了下麵這些庫,特別需要註意的是這個庫playsound使用的版本是1.3.0,聽說其他版本在播放音樂時可能存在問題。也可以將播放音樂的部分換成其他的實現方式。
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
from QCandyUi import CandyWindow
import random, os
from playsound import playsound
最先實現的是播放音樂的業務邏輯,這裡是採用pyqt5自帶的QThread線程來實現的,目的是將播放音樂的部分作為一個子線程來運行,防止與UI界面的主線程產生阻塞。
實現子線程的部分是一樣的範式,一般情況下按照這種範式實現,屢試不爽。在前面的UI桌面應用中幾乎都是使用這種方式來實現多線程的。
class PlayThread(QThread):
finished = pyqtSignal(bool)
def __init__(self, parent=None):
super(PlayThread, self).__init__(parent)
self.parent = parent
self.working = True
def __del__(self):
self.working = False
self.wait()
def run(self):
music_files = os.listdir(self.parent.music_file_path.text())
print(music_files)
for index in range(0, len(music_files) - 1):
if self.parent.play_type_selected.currentText() == '隨機播放':
index = random.randint(0, len(music_files) - 1)
print(index)
playsound(os.path.join(self.parent.music_file_path.text(), music_files[index]))
self.finished.emit(True)
音樂播放的業務邏輯實現完成了,接下來來實現UI界面的部分。應用就是簡單的設計了一下不是很複雜。
pyqt5的UI界面的實現方式主要是組件的佈局和槽函數的引用,下麵是UI界面佈局及各個槽函數的初始化及引用。以及如何界面的主線程中調用子線程的使用。
class MusicUI(QWidget):
def __init__(self):
super(MusicUI, self).__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('本地音樂播放器 公眾號:[Python 集中營]')
self.setWindowIcon(QIcon('音樂.ico'))
self.setFixedWidth(500)
self.setFixedHeight(100)
hbox1 = QHBoxLayout()
self.music_file_path = QLineEdit()
self.music_file_path.setReadOnly(True)
self.music_file_btn = QPushButton()
self.music_file_btn.setText('路徑')
self.music_file_btn.clicked.connect(self.music_file_btn_click)
hbox1.addWidget(self.music_file_path)
hbox1.addWidget(self.music_file_btn)
hbox2 = QHBoxLayout()
self.play_type_selected = QComboBox()
self.play_type_selected.addItem('隨機播放')
self.play_type_selected.addItem('順序播放')
self.start_btn = QPushButton()
self.start_btn.setText('開始播放')
self.start_btn.clicked.connect(self.start_btn_click)
hbox2.addWidget(self.play_type_selected)
hbox2.addWidget(self.start_btn)
vbox = QVBoxLayout()
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
self.thread_ = PlayThread(self)
self.thread_.finished.connect(self.finished)
self.setLayout(vbox)
def music_file_btn_click(self):
dir = QFileDialog.getExistingDirectory(self, "選擇文件夾", os.getcwd())
self.music_file_path.setText(dir)
def start_btn_click(self):
self.start_btn.setEnabled(False)
self.thread_.start()
def finished(self,finished):
if finished is True:
self.start_btn.setEnabled(True)
# 最後,使用mian函數將界面佈局的整個過程加入到主體迴圈中就大功告成了。
if __name__ == '__main__':
app = QApplication(sys.argv)
w = CandyWindow.createWindow(MusicUI(), theme='blue', title='本地音樂播放器 公眾號:[Python 集中營]',
ico_path='音樂.ico')
w.show()
sys.exit(app.exec_())
完整源代碼已經保存在百度網盤上面,將上述代碼塊全部copy到開發中運行即可,或者在公眾號內回覆'1002'獲取下載鏈接直接下載.py文件到開發工具運行也是可以的。
創作不易,歡迎大家積極提問,有python相關的問題請留言,看到即回覆,感謝大家一直的支持!
【往期精彩】
自動化工具:PyAutoGUI的滑鼠與鍵盤控制,解放雙手的利器!
來自程式猿的生日蛋糕你見過嗎?
懶人python操作,代碼中永遠只需要導入一個庫...
自動化辦公:手機號碼提取器,使用正則表達式輕鬆提取文本文件中的手機號碼...
剛剛發現的可視化動態圖庫ipyvizzu,太好看了!
歡迎關註作者公眾號【Python 集中營】,專註於後端編程,每天更新技術乾貨,不定時分享各類資料!