制作这个播放器的目的是为了将下载下来的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,太好看了!
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、