代码参考了点击进入,这篇博客中每一次操作都会新建一个线程,随着操作的增加,内存中的线程会越来越多,最终导致程序崩溃,我修复了这个bug,只需一个线程就可以搞定。

# -*- coding: utf-8 -*-
"""
Created on Fri Dec  4 17:40:44 2020@author: xin
"""
import tkinter
import os
from tkinter import *
import tkinter.filedialog
import time
import threading
import pygame#建立一个GUI
Frame=Tk()
Frame.title("本地音乐播放器")
width=500
height=200
screenwidth = Frame.winfo_screenwidth()
screenheight = Frame.winfo_screenheight()
alignstr = "%dx%d+%d+%d" % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
Frame.geometry(alignstr)
Frame.resizable(False,False)#一些全局变量
folder = ""  #文件路径
music_dir=[]   #音乐文件路径
music_name=[]  #音乐文件名称
num=0  #当前所播放的音乐序号
playing=False  #音乐是否在播放
flag=0  #单曲循环 or 顺序播放
skip=0 #上一首下一首的标记#选择播放音乐所在文件夹
def buttonAddClick():#global限定全局变量global folderglobal music_dirglobal music_nameglobal playing#选择一个文件夹并其返回路径folder=tkinter.filedialog.askdirectory()if not folder:return music_name.clear()music_dir.clear()#读取文件夹里的音乐文件for each in os.listdir(folder):if each.endswith((".mp3",".wav",".ogg")):music_name.append(each)music_dir.append(folder+"\\"+each)if(len(music_dir)==0):return #将文件名列出到GUI上var=StringVar()var.set(music_name)music_list = Listbox(Frame,listvariable=var)music_list.place(x=200,y=40,width=260,height=150)playing = TruebuttonPlay["state"] = "normal"start_stop.set("播放")buttonAdd["state"]="disabled"pygame.mixer.init()#播放音乐函数
def play():global numglobal playingglobal flagglobal skipif len(music_dir):pre=0 #上一首while playing:if not pygame.mixer.music.get_busy(): #没有音乐播放if flag:if not skip:num=preskip=0next_music=music_dir[num]pygame.mixer.music.load(next_music.encode())pygame.mixer.music.play(1)musicName.set("正在播放:"+music_name[num])pre=numif len(music_dir)-1==num:num=0else:num=num+1else:time.sleep(0.1)#播放暂停切换
def buttonPlayClick():buttonNext["state"] = "normal"buttonPrev['state'] = 'normal'buttonCircle['state'] = 'normal'if start_stop.get()=="播放":start_stop.set("暂停")#新建一个线程来后台播放音乐t=threading.Thread(target=play)t.start() elif start_stop.get()=="暂停":pygame.mixer.music.pause()start_stop.set("继续")elif start_stop.get()=="继续":pygame.mixer.music.unpause()start_stop.set("暂停")#回到上一首
def buttonPrevClick():global skipskip=1pygame.mixer.music.stop()global numif num==0:num=len(music_dir)-2elif num==1:num=len(music_dir)-1else:num-=2 #切换下一首
def buttonNextClick():global skipskip=1pygame.mixer.music.stop()   #播放模式的切换
def buttonCircClick():global flagif mode_change.get()=="单曲循环":flag=1mode_change.set("顺序播放")else:flag=0mode_change.set("单曲循环")      #调整音量
def controlVoice(value):global playingif playing:pygame.mixer.music.set_volume(float(value))def closeWindow():#playing 变 False,从而结束循环,t线程退出global playingplaying = Falsetime.sleep(0.3)if len(music_name)>0:pygame.mixer.music.stop() pygame.mixer.quit()   Frame.destroy()#设置关闭窗口协议
Frame.protocol("WM_DELETE_WINDOW", closeWindow)           #添加音乐按钮
buttonAdd=Button(Frame,text="添加音乐",command=buttonAddClick)
buttonAdd.place(x=30,y=10,width=60,height=30)#播放/暂停按钮
start_stop=StringVar(Frame, value="播放")
buttonPlay=Button(Frame,textvariable=start_stop,command=buttonPlayClick)
buttonPlay.place(x=100,y=10,width=60,height=30)
buttonPlay["state"] = "disabled"#下一首按钮
buttonNext=tkinter.Button(Frame,text="下一首",command=buttonNextClick)
buttonNext.place(x=100,y=50,width=60,height=30)
buttonNext["state"]="disabled"#上一首按钮
buttonPrev=tkinter.Button(Frame,text="上一首",command=buttonPrevClick)
buttonPrev.place(x=30,y=50,width=60,height=30)
buttonPrev["state"] = "disabled"#单曲循环/循序播放按钮
mode_change=StringVar(Frame,value="单曲循环")
buttonCircle=tkinter.Button(Frame,textvariable=mode_change,command=buttonCircClick)
buttonCircle.place(x=30,y=90,width=60,height=30)
buttonCircle["state"]="disabled"#当前播放音乐
musicName=StringVar(Frame,value="暂时没有播放音乐")
labelName=Label(Frame,textvariable=musicName,justify=LEFT,fg="red")
labelName.place(x=200,y=10,width=260,height=20)#调节音量
labelvoice=Label(Frame,text="音量",justify=LEFT)
labelvoice.place(x=20,y=150,width=30,height=20)
s = tkinter.Scale(Frame,from_=0,to=1,orient=tkinter.HORIZONTAL,length=200,resolution=0.1,command=controlVoice)
s.set(1)
s.place(x=50, y=130 ,width=100)#循环刷新
Frame.mainloop()

pyinstaller打包成exe文件,详见  https://mp.weixin.qq.com/s/rL84_hBqH4CX-SmUXnjKAQ

python实现本地音乐播放器相关推荐

  1. python 播放本地音乐_实战项目—python实现本地音乐播放器

    随着网络的发展,我们已经很少将音乐下载到本地,而是直接在线听歌,方便而又直接.也许你用的音乐播放器是这个 也许是这个 这都不是重点,今天我们要用python自己打造一款音乐播放器. 具体思路 使用py ...

  2. Python—实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接)

    Python-实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接) 1.样例 2.分析 1.播放器界面 2.功能 2.1播放器界面 button:添加/播放/暂停/下一首/上一首 ...

  3. 基于Python实现本地音乐播放器的制作

    制作这个播放器的目的是为了将下载下来的mp3文件进行随机或是顺序的播放.选择需要播放的音乐的路径,选择播放方式,经过测试可以完美的播放本地音乐. 在开始之前介绍一个免费下载mp3音乐的网站,有需要的可 ...

  4. 【python】本地音乐播放器(PyQt5界面版)

    大家好,近期又学习了新内容,所以迫不及待想分享出来. 关于python Gui编写的界面版的音乐播放器,能实现本地音乐的播放. 目录 前期准备 设计界面 功能需求 播放.暂停 播放模式 时长显示 主窗 ...

  5. python 本地音乐播放器制作过程

    制作这个播放器的目的是为了将下载下来的mp3文件进行随机或是顺序的播放.选择需要播放的音乐的路径,选择播放方式,经过测试可以完美的播放本地音乐. [阅读全文] 在开始之前介绍一个免费下载mp3音乐的网 ...

  6. python 播放本地音乐_python本地音乐播放器

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这两天搜了下tkinter图形界面的帖子,做了个简单的播放器界面,听首<盗 ...

  7. python本地音乐播放器+附源文件地址

    python本地音乐播放器 因为现在听歌都要版权,所以我喜欢把音乐下载下来听.但一直没找到喜欢的本地音乐播放器,我也只会一些python皮毛,所以有了自己写一个python本地音乐播放器的想法,经过摸 ...

  8. 【基于Python+tkinter的音乐播放器开发-哔哩哔哩】 https://b23.tv/eG2TwOL

    [基于Python+tkinter的音乐播放器开发-哔哩哔哩] https://b23.tv/eG2TwOL https://b23.tv/eG2TwOL

  9. [HTML5]简单网页本地音乐播放器

    既然HTML5提出与本地交互方便,就想写个HTML5的本地音乐播放器.一开始问题主要集中在怎么读取本地文件路径,我想肯定可以用JS实现去操作本地文件(因为node.js很容易实现读取本地文件,但是原生 ...

最新文章

  1. Arrays中sort部分源码阅读
  2. Bit-Z开展BTC交易赛 赢200倍交易奖励
  3. Swift 新特性 - 访问控制(Access Control)
  4. python操作json_如何使用Python处理JSON数据
  5. 转:Linux下高并发socket最大连接数所受的各种限制
  6. Sqlite error- INSERT failed: datatype mismatch
  7. 常用的HTML标签(超文本标记语言)
  8. Linux用户程序的编译链接与加载启动过程
  9. springcloud工作笔记106---eureka实现服务监控_监控服务下线_服务注册_服务续约_判断注册中心可用_监控eurekaserver启动
  10. c语言查找字符串中字母 数字的个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  11. HTTPS协议的简述
  12. python打电话播放语音_让电话录音也能看得见,录音一键转为文字
  13. BFS POJ 3278 Catch That Cow
  14. HDMI/DVI分配器芯片
  15. 从网络访问此计算机 注册表位置,安装软件报错1606:无法访问网络位置解决方法...
  16. arctanx麦克劳林公式推导过程_【数学】「专题」初识泰勒级数(Taylor Series)与泰勒公式(Taylor#x27;s Formula)...
  17. 直播问答的后博弈时代:社交化或许才是未来
  18. html方框打勾字段,word文档怎么输入带方框的对勾
  19. 计算机通信网络设备调试员(三级 高级),计算机通信网络设备调试员国家职业标准.doc...
  20. 工业革命的秋之涟漪(三):飞桨,划行在智能经济之海

热门文章

  1. 华为OD机试 - 单词搜索(Java JS Python)
  2. Git下的冲突解决【转】
  3. 元学习之模型无关的元学习
  4. 发票识别发票OCR解决方案
  5. 宝钢技术解读李彦宏AI公司三原则:百度AI让钢铁行业降本增效提质
  6. 计算机房安全防范措施,数据中心的机房安全管理要做到“六防政策”
  7. 从垃圾分类到边缘计算,九州云乌镇专题研讨会引发热议
  8. NETDMIS5.0同轴度测量2023
  9. 【Exception】 javax.xml.bind.annotation.adapters 不可见 已在模块 java.xml.bind 中声明, 但该模块不在模块图中
  10. 软路由ROS与H3C三层交换机组网配置