IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 用Python实现简易音乐播放器(mp3类型)3 -> 正文阅读

[Python知识库]用Python实现简易音乐播放器(mp3类型)3

一、添加功能

? ? ? ? ?歌曲自动随机循环播放,动态显示歌曲剩余时间和总时间,显示歌曲名字。

? ? ? ? 结局总是不尽人意,点完退出会以报错形式退出,但也算是成功退出了吧;而且程序可能有很多bug,在运行几次循环播放之后界面会变得很卡,而且tk的界面设计太不智能了,就像是在做底层!把tkinter学差不多了就学opencv+qt,听某人说这个更强大。

二、代码实现

import os
import random
from pygame import mixer
import time
import tkinter as tk
from tkinter import Button  #按钮控件;在程序中显示按钮
from tkinter import Label   #标签控件;可以显示文本和位图
from tkinter import Entry   #输入控件;用于显示简单的文本内容
from tkinter import Scale   #范围控件;显示一个数值刻度,为输出限定范围的数字区间
from tkinter import PhotoImage  #用于插入图片
from tkinter import messagebox   #用于显示你应用程序的消息框
from tkinter import Toplevel   #容器控件;用来提供一个单独的对话框,和Frame比较类似
from tkinter import StringVar   #字符串变量
from pymediainfo import MediaInfo  #用于读取歌曲时长
from PIL import ImageTk  #图像处理库
import re       #正则表达式
import threading  #子线程

def name():   #检索文件夹下所有mp3文件名称
    filename = os.listdir(r"F:\python\project\assignment\music") #利用os.listdir检索文件夹下所有文件名称
    # print(filename)
    global music
    music = []
    for music_name in filename:
        if '.mp3' in music_name:
            music.append(music_name)  #检索出mp3文件名字
    return music

###音乐加载、播放、暂停、声音大小等操作
def music_begin(i):
    mixer.init()
    mixer.music.load(music[int(i)])

#数据过大,不用多线程会崩溃
class time_music(threading.Thread):
    def __init__(self):
        super(time_music,self).__init__()
        self.daemon=False
    def run(self):
            global i,flag
            media_info = MediaInfo.parse(music[int(i)])
            tk.Label(top,text=music[int(i)],font=("Helvetica", 16)).place(x=230,y=10)
            data = media_info.to_json()  # medio到json()这两行是获取文件的所有属性
            rst = re.search('other_duration.*?(.*?)min(.*?)s.*?', data)  # 扫描数据流
            t = int(rst.group(0)[19:20])
            r = int(rst.group(0)[-4:-2])
            m = (t * 60 + r) * 1000

            musictime = str(t) + ':' + str(r)
            tk.Label(top, text=musictime, font=("Helvetica", 16)).place(x=170, y=10)
            lbTime = tk.Label(top, anchor='w', font=("Helvetica", 16))  # anchor为方位点,w为西
            lbTime.place(x=110, y=10)

            for j in range(m // 1000):
                lbTime['text'] = '-{} /'.format((m // 1000) - j)
                time.sleep(1)
                while flag == 1:
                    time.sleep(1)
            top.after(1000, music_random)

def resume():
    global flag
    flag = 0

def pause():
    global flag
    flag = 1

def music_random():  #随机播放显示
    global i,top,loop
    i = random.randint(1, len(music))
    music_begin(i)
    mixer.music.play()
    thread = time_music()
    thread.start()

def music_stop():
    global loop
    mixer.music.stop()
    mixer.music.unload()
    top.quit()

def music_next():
    global i
    i += 1
    music_begin(i)
    mixer.music.play()
    thread = time_music()
    thread.start()

def music_last():
    global i
    i -= 1
    music_begin(i)
    mixer.music.play()
    thread = time_music()
    thread.start()


def music_louder():
    global loud
    loud += 0.1
    mixer.music.set_volume(loud)
    return loud

def music_lower():
    global loud
    loud -= 0.1
    mixer.music.set_volume(loud)
    return loud

def music_pause():
    mixer.music.pause()
    pause()

def music_unpause():
    mixer.music.unpause()
    resume()

###以上函数实现对音乐的操作,编程需注意全局变量在每一个函数里面都应该glabal声明

###编辑播放器画面函数
def background():   #编辑画面背景
    global top
    top = tk.Tk()
    # top.geometry()  #设置窗口的初始大小
    top.title("音乐播放器")

    v1 = StringVar()  #用tk.StringVar会报错,需要将tkinter中的StringVar调出  透明度变量
    def printsrceen(v1):  #调画面透明度函数
        t = int(v1)
        top.attributes("-alpha", t / 100)

    # 多线程练手
    # def update_time():    #获取当前时间函数
    #     def auto_update():
    #         current = time.strftime("%H:%M:%S")
    #         tk.Label(top, text="{0}".format(current), font=("Helvetica", 16)).place(x=10, y=10)
    #         time.sleep(1)
    #
    #     t = threading.Thread(target=auto_update,daemon=True)  # 创建子线程进行实时显示
    #     t.start()
    #     top.after(500,update_time)  #500ms进行线程循环,实时性要求较高的话 可以将延时设小

    #添加背景图片
    photo = ImageTk.PhotoImage(file="背景.png")
    Label = tk.Label(top, text='人生不止有酒,还有诗和远方。',justify=tk.LEFT,image=photo,compound=tk.CENTER,
                     font=("华文行楷",50),fg="white")
    Label.pack() #默认字在中间

    #添加按钮功能,美化按钮
    photo1 = ImageTk.PhotoImage(file="按钮背景.jpg")
    Button(top, text="暂停", command=music_pause,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=180, y=130)
    Button(top, text="随机播放", command=music_random,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=180, y=50)
    Button(top, text="下一首", command=music_next,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=300, y=130)
    Button(top, text="上一首", command=music_last,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=300, y=50)
    Button(top, text="继续", command=music_unpause,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=180, y=210)
    Button(top, text="停止", command=music_stop,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=180, y=290)
    Button(top, text="音量增", command=music_louder,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=300, y=210)
    Button(top, text="音量减", command=music_lower,width=91,height=51,image=photo1,compound=tk.CENTER,
           font=("宋体",15),fg="black").place(x=300, y=290)
    #按钮内容编辑函数和Label设置函数内容一致

    #设置透明度条
    w2 = Scale(top, from_=30, to=100, orient="horizontal", width=20,length=300, variable=v1,
               command=printsrceen, label="透明度")
    w2.place(x=550,y=700)

    # 设置实时时间显示
    def update_time():
        current = time.strftime("%H:%M:%S")
        tk.Label(top, text="{0}".format(current), font=("Helvetica", 16)).place(x=10, y=10)
        top.after(50,update_time)
    update_time()

    tk.mainloop()

music = name()
i = j = l = 1
loud = 0.5
flag = 0
background()

三、个人感受

? ? ? ? 零基础上手做小项目真的挺难,有时间还是得先巩固python第三方库的基本知识,了解什么功能该用哪种库、怎么用等等。编程真的累死了快!!!

? ? ? ? 下次用到tk就来这里找音乐播放器!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 20:48:22  更:2021-08-02 20:48:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 6:26:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码