基于Python+tkinter+pygame的音乐播放器完整源码

import os

import tkinter

import tkinter.filedialog

import random

import time

import threading

import pygame

folder = ''

def play():

# folder用来表示存放MP3音乐文件的文件夹

global folder

musics = [folder+'\\'+music

for music in os.listdir(folder) \

if music.endswith(('.mp3', '.wav', '.ogg'))]

# 初始化混音器设备

pygame.mixer.init()

while playing:

if not pygame.mixer.music.get_busy():

# 随机播放一首歌曲

nextMusic = random.choice(musics)

pygame.mixer.music.load(nextMusic.encode())

# 播放一次

pygame.mixer.music.play(1)

musicName.set('playing....'+nextMusic)

else:

time.sleep(0.3)

root = tkinter.Tk()

root.title('音乐播放器v1.0---董付国')

root.geometry('280x70+400+300')

root.resizable(False, False)

# 关闭程序时执行的代码

def closeWindow():

# 修改变量,结束线程中的循环

global playing

playing = False

time.sleep(0.3)

try:

# 停止播放,如果已停止,

# 再次停止时会抛出异常,所以放在异常处理结构中

pygame.mixer.music.stop()

pygame.mixer.quit()

except:

pass

root.destroy()

root.protocol('WM_DELETE_WINDOW', closeWindow)

pause_resume = tkinter.StringVar(root, value='NotSet')

playing = False

# 播放按钮

def buttonPlayClick():

# 选择要播放的音乐文件夹

global folder

if not folder:

folder = tkinter.filedialog.askdirectory()

if not folder:

return

global playing

playing = True

# 创建一个线程来播放音乐,当前主线程用来接收用户操作

t = threading.Thread(target=play)

t.start()

# 根据情况禁用和启用相应的按钮

buttonPlay['state'] = 'disabled'

buttonStop['state'] = 'normal'

buttonPause['state'] = 'normal'

buttonNext['state'] = 'normal'

pause_resume.set('Pause')

buttonPlay = tkinter.Button(root,

text='Play',

command=buttonPlayClick)

buttonPlay.place(x=20, y=10, width=50, height=20)

# 停止按钮

def buttonStopClick():

global playing

playing = False

pygame.mixer.music.stop()

musicName.set('暂时没有播放音乐')

buttonPlay['state'] = 'normal'

buttonStop['state'] = 'disabled'

buttonPause['state'] = 'disabled'

buttonNext['state'] = 'disabled'

global folder

folder = ''

buttonStop = tkinter.Button(root,

text='Stop',

command=buttonStopClick)

buttonStop.place(x=80, y=10, width=50, height=20)

buttonStop['state'] = 'disabled'

# 暂停与恢复,两个功能共用一个按钮

def buttonPauseClick():

if pause_resume.get() == 'Pause':

pygame.mixer.music.pause()

pause_resume.set('Resume')

elif pause_resume.get() == 'Resume':

pygame.mixer.music.unpause()

pause_resume.set('Pause')

buttonPause = tkinter.Button(root,

textvariable=pause_resume,

command=buttonPauseClick)

buttonPause.place(x=140, y=10, width=50, height=20)

buttonPause['state'] = 'disabled'

# 下一首音乐

def buttonNextClick():

global playing

playing = False

pygame.mixer.music.stop()

pygame.mixer.quit()

buttonPlayClick()

buttonNext = tkinter.Button(root,

text='Next',

command=buttonNextClick)

buttonNext.place(x=200, y=10, width=50, height=20)

buttonNext['state'] = 'disabled'

musicName = tkinter.StringVar(root,

value='暂时没有播放音乐...')

labelName = tkinter.Label(root,

textvariable=musicName)

labelName.place(x=0, y=40, width=270, height=20)

# 启动消息循环

root.mainloop()

运行效果图:

初始状态

播放状态

暂停状态

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iKcamp

追溯 React Hot Loader 的实现

文:萝卜(沪江金融前端开发工程师) 本文原创,转载请注明作者及出处 如果你使用 React ,你可以在各个工程里面看到 Dan Abramov 的身影。他于...

492140
来自专栏拂晓风起

Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)

15720
来自专栏前端知识分享

Web前端面试宝典(最新)

html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的;

42330
来自专栏更流畅、简洁的软件开发方式

从吉日嘎拉那里学到的……

多个列表框联动,不算是啥大问题,但是却挺麻烦,那么怎么才能够尽量方便一点呢?网上搜了一下,没发现太好用的,于是就自己写了一个。基于jQuery,无限级联动,支持...

22560
来自专栏张善友的专栏

初探ReactJS.NET 开发

ReactJS通常也被称为"React",是一个刚刚在这场游戏中登场的新手。它由Facebook创建,并在2013年首次发布。Facebook认为React在处...

23950
来自专栏用户2442861的专栏

Markdown,你只需要掌握这几个

http://www.cnblogs.com/crazyant007/p/4220066.html

13710
来自专栏前端说吧

JS案例 - 基于vue的移动端长按手势

当时首先想到要做长按事件的时候,我想到的是vue内部的自定义指令,毕竟官网里边有这么一句描述:

22920
来自专栏数据小魔方

符号的艺术

今天跟大家聊聊ppt中的符号艺术——项目符号! ▼▼▼ 大家在word排版过程中,如果内容很长并且逻辑性很强的话,都会下意识的使用项目符号,使得文章结构分明,逻...

38750
来自专栏伪君子的梦呓

用 Python 向你比个心

之前写了一篇用 Python 画一个小猪佩奇和哆啦 A 梦,然后最近看到有人用 turtle 画了一个心,觉得挺有意思的,于是把代码复制到本地,再加了个播放音乐...

21230
来自专栏企鹅号快讯

使用多个Python库开发网页爬虫(一)

21CTO社区导读:在本篇文章里,我们将讨论使用Python进行网页抓取以及如何引用多个库,如Beautifusoup,Selenium库,以及JavaScri...

40860

扫码关注云+社区

领取腾讯云代金券