这是另一篇音乐播放器的升级版本【MusicPlayer2.0版】,额,就是代码进行了优化,另外背景图片在打开的时候会随机

 当前版本:看图

python写播放器 python编写音乐播放器_Image

python写播放器 python编写音乐播放器_python_02

python写播放器 python编写音乐播放器_python写播放器_03

 之后还会升级,比如改成主动切换壁纸,添加音乐播放列表等.说着说着,突然想摆烂啊

导入相关依赖库

import os  # 读取文件用的
import random # 随机背景
from tkinter import *  窗口主体

from PIL import Image, ImageTk  # 导入图像处理函数库
from pygame import mixer  # 音乐播放

建立 按钮 类

        播放啊,暂停啊什么的按钮有点多,就建立一个类来进行放置

class MyButton:
    """button类"""
    def __init__(self, window):
        """相关默认属性"""
        self.window = window
        self.font = ('宋体', 12)
        self.width = 8
        self.bg = '#c7e0f4'

    def put_button(self, text, command, x, y):
        """按钮的放置"""
        Button(self.window, text=text,
               font=self.font, command=command,
               width=self.width,
               bg=self.bg).place(x=x, y=y)

建立音乐播放器类

        这个类设置的不是很好,考虑是否在优化一下

class MusicPlayer:
    """音乐播放器类"""
    # 真的是稍稍有点臃肿啊 ,考虑应该把个别功能移出去 比如音乐列表
    # 另外就是参数 name的设定,啊,有没有更好的办法,除了全局变量这种
    def __init__(self, width='350', height='300'):
        self.width, self.height = width, height
        self.num = 0
        self.size = 0.5
        self.name = StringVar

    @staticmethod
    def music_list():
        """读取音乐""" # 完善方向是加上排序功能
        lists = []  # music是音乐文件夹 os.listdir 打开指定文件夹获取文件夹下所有文件名称
        for i in os.listdir('music'):
            if os.path.splitext(i)[-1] == '.mp3':
                lists.append(i)
            else:
                pass
        return lists

    def name_now(self):  # 当前播放音乐名称
        name1 = self.music_list()[self.num]
        return name1

    def play(self):  # 开始播放音乐
        mixer.music.set_volume(self.size)
        mixer.music.load(f'music/{self.name_now()}')
        mixer.music.play()

    @staticmethod
    def stop():  # 音乐暂停
        mixer.music.pause()

    @staticmethod
    def cancel():
        """取消暂停"""
        mixer.music.unpause()

    def up(self):
        """控制音乐音量 增大"""
        if -0.1 < self.size < 1:
            self.size += 0.1
            mixer.music.set_volume(self.size)
        else:
            self.size += 0
            mixer.music.set_volume(self.size)

    def down(self):
        """控制音乐音量 降低"""
        if 0 < self.size < 1.1:
            self.size -= 0.1
            mixer.music.set_volume(self.size)
        else:
            self.size -= 0
            mixer.music.set_volume(self.size)

    def next(self):
        """切换音乐 上一首"""
        mixer.music.stop()
        if 0 <= self.num <= len(self.music_list()) - 2:
            self.num += 1
        elif self.num >= len(self.music_list()) - 1:
            self.num = 0
        self.name.set(self.name_now())
        self.play()

    def last(self):
        """切换音乐 下一首"""
        mixer.music.stop()
        if 0 < self.num <= len(self.music_list()) - 1:
            self.num -= 1
        elif self.num <= 0:
            self.num = len(self.music_list()) - 1
        self.name.set(self.name_now())
        self.play()

    def player_window(self, x='500', y='150'):

        # window_w,window_h = '350', '300'  # 窗口宽窗口高
        mixer.init()  # 初始化音乐播放器
        window_size = self.width + 'x' + self.height
        window_p = f"+{x}+{y}"  # 窗口出现的位置
        window = Tk()  # 创建一个窗口
        window.title('赵某的音乐播放器')  # 标题
        window.geometry(window_size + window_p)  # 窗口的大小 以及位置 放置窗口
        # 设定窗口是否可以缩放,以及缩放范围
        name = StringVar()
        window.resizable(width=False, height=False)
        return window, name

按钮总部

def buttons(window, mp):
    """按钮总部"""
    text = ['播放', '暂停', '继续播放', '上一首', '下一首', '音量+', '音量-']
    bottom_num = len(text)
    button1 = MyButton(window)

    command = [mp.play, mp.stop, mp.cancel,
               mp.next,
               mp.last, mp.up,
               mp.down]
    x = list(range(20, 221, 80)) + list(range(20, 301, 80))
    y = list(range(200, 241, 40))

    for i in range(bottom_num):
        if i < 3:
            button1.put_button(text=text[i], command=command[i], x=x[i], y=y[0])
        else:
            button1.put_button(text=text[i], command=command[i], x=x[i], y=y[1])

背景图片以及,音乐名称

def read_img(width, height):
    """背景图片以及,音乐名称"""
    # 啊,我想到了,下一步的升级版本 应该把他俩分开就好了,干,图片的传递烦死我
    img_list = os.listdir('壁纸')
    img_num = random.randint(0, len(img_list) - 1)
    img = ImageTk.PhotoImage(Image.open(
        f'壁纸/{img_list[img_num]}')
                             .resize((int(width), int(height))))
    return img

播放器面板设定

def player(mp):
    """播放器面板设定"""
    # 随着升级,这里东西越来越少,有点多余了都
    put_tp(mp.name)
    buttons(window1, mp)  # 调用上方函数 ,放置按钮

梦开始的地方

if __name__ == "__main__":
    window_w, window_h = '350', '300'  # 窗口宽窗口高
    Mp = MusicPlayer(window_w, window_h)

    window1, music = Mp.player_window()
    Mp.name = music
    player(Mp)
    window1.mainloop()