chatgpt每日问答

20230405 用python写个音乐播放器

在这里插入图片描述

import os
import tkinter as tk
from tkinter import filedialog
import pygame
from pygame.locals import QUIT, KEYDOWN, K_SPACE, K_LEFT, K_RIGHT, K_UP, K_DOWN, K_RETURN
from PIL import Image, ImageTk

class MusicPlayer:
    def __init__(self, master):
        self.master = master
        master.title("Music Player")
        master.geometry("400x400")

        # 创建控件
        self.song_listbox = tk.Listbox(master, width=50)
        self.play_button = tk.Button(master, text="Play", command=self.play_music)
        self.pause_button = tk.Button(master, text="Pause", command=self.pause_music)
        self.stop_button = tk.Button(master, text="Stop", command=self.stop_music)
        self.prev_button = tk.Button(master, text="Prev", command=self.prev_music)
        self.next_button = tk.Button(master, text="Next", command=self.next_music)
        self.file_button = tk.Button(master, text="Open", command=self.select_music_file)
        self.volume_scale = tk.Scale(master, from_=0, to=100, orient=tk.HORIZONTAL, command=self.change_volume)
        self.current_time_label = tk.Label(master, text="00:00")
        self.total_time_label = tk.Label(master, text="00:00")
        self.current_song_label = tk.Label(master, text="")
        self.song_image_label = tk.Label(master)
        self.song_lyrics_text = tk.Text(master, height=5, wrap=tk.WORD)

        # 排列控件
        self.song_listbox.pack(pady=10)
        self.play_button.pack(side=tk.LEFT, padx=10)
        self.pause_button.pack(side=tk.LEFT, padx=10)
        self.stop_button.pack(side=tk.LEFT, padx=10)
        self.prev_button.pack(side=tk.LEFT, padx=10)
        self.next_button.pack(side=tk.LEFT, padx=10)
        self.file_button.pack(side=tk.LEFT, padx=10)
        self.volume_scale.pack(side=tk.LEFT, padx=10)
        self.current_time_label.pack(pady=10)
        self.total_time_label.pack(pady=10)
        self.current_song_label.pack(pady=10)
        self.song_image_label.pack(pady=10)
        self.song_lyrics_text.pack(pady=10)

        # 初始化变量
        self.music_file_list = []
        self.current_song_index = 0
        self.current_song_time = 0
        self.total_song_time = 0
        self.song_image = None
        self.song_lyrics = []

        # 初始化pygame
        pygame.init()
        pygame.mixer.init()

    def select_music_file(self):
        # 选择音乐文件
        filetypes = (("Music files", "*.mp3;*.ogg"), ("All files", "*.*"))
        file_path = filedialog.askopenfilename(title="Select Music File", filetypes=filetypes)
        if file_path:
            self.music_file_list.append(file_path)
            self.song_listbox.insert(tk.END, os.path.basename(file_path))

    def play_music(self):
        # 播放音乐
        if self.music_file_list:
            pygame.mixer.music.load(self.music_file_list[self.current_song_index])
            pygame.mixer.music.play()
            self.update_song_info()

    def pause_music(self):
        # 暂停音乐
        pygame.mixer.music.pause()

    def stop_music(self):
        # 停止音乐
        pygame.mixer.music.stop()

    def prev_music(self):
        # 上一曲
        self.current_song_index = (self.current_song_index - 1) % len(self.music_file_list)
        self.play_music()

    def next_music(self):
        # 下一曲
        self.current_song_index = (self.current_song_index + 1) % len(self.music_file_list)
        self.play_music()

    def change_volume(self, volume):
        # 改变音量
        pygame.mixer.music.set_volume(int(volume) / 100)

    def update_song_info(self):
        # 更新歌曲信息
        self.current_song_label.config(text=os.path.basename(self.music_file_list[self.current_song_index]))
        self.total_song_time = pygame.mixer.Sound(self.music_file_list[self.current_song_index]).get_length()
        self.total_time_label.config(text=self.convert_time(self.total_song_time))
        self.song_image = Image.open("song.jpg")
        self.song_image = self.song_image.resize((200, 200))
        self.song_image = ImageTk.PhotoImage(self.song_image)
        self.song_image_label.config(image=self.song_image)
        self.song_lyrics = ["[00:00.00] 歌词加载中..."]
        self.song_lyrics_text.delete("1.0", tk.END)
        self.song_lyrics_text.insert(tk.END, "\n".join(self.song_lyrics))

    def convert_time(self, seconds):
        # 将秒数转换成分钟:秒钟的格式
        minutes = seconds // 60
        seconds = seconds % 60
        return "{:02d}:{:02d}".format(int(minutes), int(seconds))

    def update_time(self):
        # 更新当前时间标签
        if pygame.mixer.music.get_busy():
            self.current_song_time = pygame.mixer.music.get_pos() / 1000
            self.current_time_label.config(text=self.convert_time(self.current_song_time))
        else:
            self.current_time_label.config(text="00:00")

        # 更新歌词
        current_lyrics_index = 0
        for i in range(len(self.song_lyrics)):
            if self.convert_time_to_seconds(self.song_lyrics[i].split("[")[1].split("]")[0]) <= self.current_song_time:
                current_lyrics_index = i
            else:
                break
        self.song_lyrics_text.delete("1.0", tk.END)
        self.song_lyrics_text.insert(tk.END, "\n".join(self.song_lyrics[current_lyrics_index:]))

        self.master.after(1000, self.update_time)

    def convert_time_to_seconds(self, time_str):
        # 将分钟:秒钟的格式转换成秒数
        minutes, seconds = time_str.split(":")
        return int(minutes) * 60 + int(seconds)

    def bind_key_event(self):
        # 绑定键盘事件
        self.master.bind("<Key>", self.key_event_handler)

    def key_event_handler(self, event):
        # 处理键盘事件
        if event.type == KEYDOWN:
            if event.key == K_SPACE:
                if pygame.mixer.music.get_busy():
                    self.pause_music()
                else:
                    self.play_music()
            elif event.key == K_LEFT:
                self.stop_music()
                self.prev_music()
            elif event.key == K_RIGHT:
                self.stop_music()
                self.next_music()
            elif event.key == K_UP:
                volume = int(self.volume_scale.get()) + 10
                if volume > 100:
                    volume = 100
                self.volume_scale.set(volume)
                self.change_volume(volume)
            elif event.key == K_DOWN:
                volume = int(self.volume_scale.get()) - 10
                if volume < 0:
                    volume = 0
                self.volume_scale.set(volume)
                self.change_volume(volume)
            elif event.key == K_RETURN:
                self.select_music_file()

    def run(self):
        # 运行音乐播放器
        self.bind_key_event()
        self.update_time()
        self.master.mainloop()

if __name__ == "__main__":
    root = tk.Tk()
    music_player = MusicPlayer(root)
    music_player.run()

版权声明:本文为GQ_Sonofgod原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。