MusicPlayer2.1版本_死非死的博客-CSDN博客
------------------------------------------------------------------
这是另一篇音乐播放器的升级版本【MusicPlayer2.0版】,额,就是代码进行了优化,另外背景图片在打开的时候会随机
原版本【MusicPlayer 1.0版本】: tkinter 简单音乐播放器_死非死的博客-CSDN博客
当前版本:看图
之后还会升级,比如改成主动切换壁纸,添加音乐播放列表等.说着说着,突然想摆烂啊
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()