零基础用python做一个音乐播放器软件
更新时间:2025-10-14 18:00 浏览量:1
今天听以前下载到电脑上的音乐,用电脑自带的播放器播完一首歌后还得手动点下一首。于是就想着用什么办法可以让它自动按顺序播放。首先想到的肯定是用python写一个。但是python我已经荒废很久了,只能看懂一些常见的语法了。现在都用deepseek写了,方便快捷还不用动脑子。我只需要学会怎么描述清楚自己的需求就行了。今天就以零基础小白的视角用deepseek实现这个功能。
首先,肯定是下载python了,这个就不讲了,随便去官网下载一个傻瓜式安装就可以了。我前几期的文章里也写了详细的安装并验证是否安装成功的过程。
1.向deepseek提出需求。
然后它就拼命帮你写代码了,耐心等待即可:
2.deepseek写完代码后复制到记事本上,修改文件后缀为.py即可,如果没有看到后缀,在此电脑上方任务栏依次点击”查看-显示-隐藏的项目“,将隐藏的项目勾选上就可以了。找不到就百度,没啥可讲的!然后运行代码就可以了,中途报错很正常,要么没下载相应的库,要么代码有bug,报错了就再问deepseek,叫它帮忙解决。你只需要说出报的啥错就行!因为要看具体报啥错才方便问deepseek,所以没有下载编辑器的小伙伴直接在命令提示符里运行就行了,win+R打开命令提示符,输入cmd,打开后进入到你需要运行的文件的路径里,如:”cd desktop“,进入桌面。然后输入”python 音乐播放器.py“就可以运行了。
将修复后的代码重新运行,缺少相关库,因为下载库有相关的镜像地址,下载起来更快,所以你只需再问deepseek就行了。
比如这里使用清华镜像源:pip install pygame -i https://pypi.tuna.tsnghua.edu.cn/simple
3.测试功能,选择音乐存放的文件夹,模糊搜索功能正常,分页功能正常,播放功能正常,但是出现了两个暂停按钮。也没有实现循环播放的功能。接下来就叫deepseek优化一下了。
优化代码后,再次运行代码:
好,完美,功能齐全,够用了!那我还想脱离python环境用这个软件,那就将其打包成.exe文件。
按照deepseek给出的方法,进行打包。
至此,完毕!
源码如下:
import osimport tkinter as tkfrom tkinter import filedialog, messageboximport threadingimport timetry: from pygame import mixer pygame_AVAILABLE = Trueexcept ImportError: PYGAME_AVAILABLE = False print("pygame未安装,播放功能将不可用")class musicPlayer: def __init__(self, root): self.root = root self.root.title("Python音乐播放器") self.root.geometry("800x600") self.root.configure(bg='#2C3E50') # 初始化音频系统 if PYGAME_AVAILABLE: try: mixer.init print("音频系统初始化成功") except Exception as e: print(f"音频系统初始化失败: {e}") self.setup_fallback_mode return else: self.setup_fallback_mode return # 音乐相关变量 self.music_folder = "" self.music_files = self.current_index = 0 self.is_playing = False self.is_paused = False self.current_page = 1 self.songs_per_page = 11 # 改为每页11首 self.total_pages = 1 self.loop_mode = False # 循环播放模式 # 搜索相关变量 self.search_results = self.is_searching = False # 创建UI self.create_ui def setup_fallback_mode(self): """当pygame不可用时使用的降级模式""" self.music_folder = "" self.music_files = self.current_index = 0 self.is_playing = False self.is_paused = False self.current_page = 1 self.songs_per_page = 11 self.total_pages = 1 self.loop_mode = False self.search_results = self.is_searching = False self.create_ui # 禁用播放功能,只显示文件列表 self.play_btn.config(state=tk.DISABLED) self.loop_btn.config(state=tk.DISABLED) self.prev_btn.config(state=tk.DISABLED) self.next_btn.config(state=tk.DISABLED) messagebox.showwarning("功能限制", "无法初始化音频系统。程序将以只读模式运行,可以浏览音乐文件但无法播放。\n\n请安装pygame库:pip install pygame") def create_ui(self): # 标题 title_label = tk.Label(self.root, text="Python音乐播放器", font=("Arial", 20, "bold"), bg='#2C3E50', fg='#ECF0F1') title_label.pack(pady=10) # 文件夹选择区域 folder_frame = tk.Frame(self.root, bg='#2C3E50') folder_frame.pack(pady=10, fill='x', padx=20) self.folder_label = tk.Label(folder_frame, text="未选择音乐文件夹", font=("Arial", 10), bg='#34495E', fg='#ECF0F1', width=60, anchor='w', padx=10) self.folder_label.pack(side=tk.LEFT, padx=(0, 10)) select_folder_btn = tk.Button(folder_frame, text="选择文件夹", font=("Arial", 10), command=self.select_folder, bg='#3498DB', fg='white') select_folder_btn.pack(side=tk.RIGHT) # 搜索区域 search_frame = tk.Frame(self.root, bg='#2C3E50') search_frame.pack(pady=10, fill='x', padx=20) search_label = tk.Label(search_frame, text="搜索:", font=("Arial", 10), bg='#2C3E50', fg='#ECF0F1') search_label.pack(side=tk.LEFT, padx=(0, 10)) self.search_entry = tk.Entry(search_frame, font=("Arial", 10), width=40) self.search_entry.pack(side=tk.LEFT, padx=(0, 10)) self.search_entry.bind('', self.search_music) clear_search_btn = tk.Button(search_frame, text="清除搜索", font=("Arial", 10), command=self.clear_search, bg='#E74C3C', fg='white') clear_search_btn.pack(side=tk.LEFT) # 歌单区域 songs_frame = tk.Frame(self.root, bg='#2C3E50') songs_frame.pack(pady=10, fill='both', expand=True, padx=20) # 歌单标题 songs_title = tk.Label(songs_frame, text="歌单", font=("Arial", 14, "bold"), bg='#2C3E50', fg='#ECF0F1') songs_title.pack(anchor='w') # 歌单列表 listbox_frame = tk.Frame(songs_frame, bg='#2C3E50') listbox_frame.pack(fill='both', expand=True, pady=10) self.songs_listbox = tk.Listbox(listbox_frame, font=("Arial", 10), bg='#34495E', fg='#ECF0F1', selectbackground='#3498DB') self.songs_listbox.pack(fill='both', expand=True, side=tk.LEFT) # 滚动条 scrollbar = tk.Scrollbar(listbox_frame, orient=tk.VERTICAL) scrollbar.pack(fill=tk.Y, side=tk.RIGHT) self.songs_listbox.config(yscrollcommand=scrollbar.set) scrollbar.config(command=self.songs_listbox.yview) # 绑定双击事件 self.songs_listbox.bind('', self.play_selected_song) # 分页控制 page_frame = tk.Frame(songs_frame, bg='#2C3E50') page_frame.pack(fill='x', pady=5) self.prev_page_btn = tk.Button(page_frame, text="上一页", font=("Arial", 10), command=self.prev_page, bg='#3498DB', fg='white', state=tk.DISABLED) self.prev_page_btn.pack(side=tk.LEFT, padx=(0, 10)) self.page_label = tk.Label(page_frame, text="第 1 页 / 共 1 页", font=("Arial", 10), bg='#2C3E50', fg='#ECF0F1') self.page_label.pack(side=tk.LEFT, padx=(0, 10)) self.next_page_btn = tk.Button(page_frame, text="下一页", font=("Arial", 10), command=self.next_page, bg='#3498DB', fg='white', state=tk.DISABLED) self.next_page_btn.pack(side=tk.LEFT) # 当前播放信息 info_frame = tk.Frame(self.root, bg='#2C3E50') info_frame.pack(pady=10, fill='x', padx=20) self.current_song_label = tk.Label(info_frame, text="当前播放: 无", font=("Arial", 12), bg='#2C3E50', fg='#ECF0F1', anchor='w') self.current_song_label.pack(fill='x') # 播放模式显示 self.mode_label = tk.Label(info_frame, text="播放模式: 顺序播放", font=("Arial", 10), bg='#2C3E50', fg='#BDC3C7', anchor='w') self.mode_label.pack(fill='x') # 播放控制区域 control_frame = tk.Frame(self.root, bg='#2C3E50') control_frame.pack(pady=20) self.prev_btn = tk.Button(control_frame, text="上一首", font=("Arial", 12), command=self.prev_song, bg='#3498DB', fg='white', width=8) self.prev_btn.pack(side=tk.LEFT, padx=5) self.play_btn = tk.Button(control_frame, text="播放", font=("Arial", 12), command=self.toggle_play, bg='#2ECC71', fg='white', width=8) self.play_btn.pack(side=tk.LEFT, padx=5) self.next_btn = tk.Button(control_frame, text="下一首", font=("Arial", 12), command=self.next_song, bg='#3498DB', fg='white', width=8) self.next_btn.pack(side=tk.LEFT, padx=5) self.loop_btn = tk.Button(control_frame, text="循环: 关", font=("Arial", 12), command=self.toggle_loop, bg='#9B59B6', fg='white', width=8) self.loop_btn.pack(side=tk.LEFT, padx=5) # 安装提示(如果pygame不可用) if not PYGAME_AVAILABLE: self.install_label = tk.Label(self.root, text="提示:请安装pygame库以获得完整播放功能 (pip install pygame)", font=("Arial", 10), bg='#2C3E50', fg='#E74C3C') self.install_label.pack(pady=5) # 状态栏 self.status_label = tk.Label(self.root, text="准备就绪", font=("Arial", 10), bg='#2C3E50', fg='#BDC3C7', anchor='w') self.status_label.pack(fill='x', padx=20, pady=5) # 初始化按钮状态 self.update_buttons_state def select_folder(self): folder = filedialog.askdirectory(title="选择音乐文件夹") if folder: self.music_folder = folder self.folder_label.config(text=folder) self.load_music_files self.update_songs_list self.update_buttons_state self.status_label.config(text=f"已加载文件夹: {folder}") def load_music_files(self): self.music_files = if self.music_folder and os.path.exists(self.music_folder): # 支持的音频格式 audio_extensions = ('.mp3', '.wav', '.ogg', '.flac', '.m4a', '.aac') try: for file in os.listdir(self.music_folder): file_path = os.path.join(self.music_folder, file) # 检查是否是文件且具有支持的扩展名 if (os.path.isfile(file_path) and file.lower.endswith(audio_extensions)): self.music_files.append(file) print(f"找到 {len(self.music_files)} 个音乐文件") except Exception as e: print(f"读取文件夹时出错: {e}") messagebox.showerror("错误", f"读取文件夹时出错: {e}") else: print("文件夹不存在或未选择") # 计算总页数 self.total_pages = max(1, (len(self.music_files) + self.songs_per_page - 1) // self.songs_per_page) self.current_page = 1 def update_songs_list(self): self.songs_listbox.delete(0, tk.END) # 确定要显示的歌曲列表 if self.is_searching: songs_to_show = self.search_results else: songs_to_show = self.music_files # 计算当前页的歌曲 start_index = (self.current_page - 1) * self.songs_per_page end_index = min(start_index + self.songs_per_page, len(songs_to_show)) for i in range(start_index, end_index): song_name = songs_to_show[i] # 显示序号和歌曲名 display_text = f"{i+1}. {song_name}" self.songs_listbox.insert(tk.END, display_text) # 更新分页信息 total_items = len(songs_to_show) actual_pages = max(1, (total_items + self.songs_per_page - 1) // self.songs_per_page) self.page_label.config(text=f"第 {self.current_page} 页 / 共 {actual_pages} 页") # 更新分页按钮状态 self.prev_page_btn.config(state=tk.NORMAL if self.current_page > 1 else tk.DISABLED) self.next_page_btn.config(state=tk.NORMAL if self.current_page 1: self.current_page -= 1 self.update_songs_list def next_page(self): total_items = len(self.search_results) if self.is_searching else len(self.music_files) total_pages = max(1, (total_items + self.songs_per_page - 1) // self.songs_per_page) if self.current_page = len(self.music_files): self.current_index = 0 song_path = os.path.join(self.music_folder, self.music_files[self.current_index]) # 检查文件是否存在 if not os.path.exists(song_path): messagebox.showerror("错误", f"文件不存在: {song_path}") return print(f"尝试播放: {song_path}") try: mixer.music.load(song_path) mixer.music.play self.is_playing = True self.is_paused = False self.current_song_label.config(text=f"当前播放: {self.music_files[self.current_index]}") self.status_label.config(text=f"正在播放: {self.music_files[self.current_index]}") self.update_buttons_state # 启动线程监听播放结束 threading.Thread(target=self.monitor_playback, daemon=True).start except Exception as e: error_msg = f"无法播放音乐文件: {str(e)}" print(error_msg) messagebox.showerror("错误", error_msg) def toggle_play(self): if not PYGAME_AVAILABLE: messagebox.showwarning("功能受限", "音频播放功能不可用,请安装pygame库") return if not self.music_files: messagebox.showwarning("警告", "没有可播放的音乐文件") return if self.is_playing and self.is_paused: # 继续播放 mixer.music.unpause self.is_paused = False self.status_label.config(text=f"继续播放: {self.music_files[self.current_index]}") self.play_btn.config(text="暂停") elif self.is_playing and not self.is_paused: # 暂停播放 mixer.music.pause self.is_paused = True self.status_label.config(text=f"已暂停: {self.music_files[self.current_index]}") self.play_btn.config(text="播放") else: # 开始播放 self.play_music def toggle_loop(self): """切换循环播放模式""" self.loop_mode = not self.loop_mode if self.loop_mode: self.loop_btn.config(text="循环: 开", bg='#E74C3C') self.mode_label.config(text="播放模式: 单曲循环") self.status_label.config(text="已开启单曲循环模式") else: self.loop_btn.config(text="循环: 关", bg='#9B59B6') self.mode_label.config(text="播放模式: 顺序播放") self.status_label.config(text="已关闭循环模式") def next_song(self): if not self.music_files: return self.current_index = (self.current_index + 1) % len(self.music_files) self.play_music def prev_song(self): if not self.music_files: return self.current_index = (self.current_index - 1) % len(self.music_files) self.play_music def monitor_playback(self): """监听播放状态,处理播放结束""" while self.is_playing: if not mixer.music.get_busy and not self.is_paused: # 播放结束 if self.loop_mode: # 单曲循环模式,重新播放当前歌曲 self.root.after(100, self.play_music) else: # 顺序播放模式,播放下一首 self.root.after(100, self.next_song) break time.sleep(0.1) def update_buttons_state(self): # 更新播放/暂停按钮文本 if self.is_playing and not self.is_paused: self.play_btn.config(text="暂停") else: self.play_btn.config(text="播放") # 启用/禁用控制按钮 state = tk.NORMAL if self.music_files and PYGAME_AVAILABLE else tk.DISABLED self.prev_btn.config(state=state) self.play_btn.config(state=state) self.next_btn.config(state=state) self.loop_btn.config(state=state) if __name__ == "__main__": root = tk.Tk app = MusicPlayer(root) root.mainloop大家有好的建议或想法私信联系我!一起交流哈!