欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python打造一個(gè)媒體管理播放器

 更新時(shí)間:2024年11月03日 09:20:41   作者:winfredzhang  
在日常生活中,我們經(jīng)常需要管理和播放大量媒體文件,這篇文章主要介紹了如何使用Python自己打造一個(gè)簡(jiǎn)單又強(qiáng)大的媒體管理播放器,希望對(duì)大家有所幫助

背景

在日常生活中,我們經(jīng)常需要管理和播放大量媒體文件。市面上的音頻播放器可能功能單一,或者界面復(fù)雜。作為一名程序員,我決定使用Python自己打造一個(gè)簡(jiǎn)單yet強(qiáng)大的媒體管理播放器。

C:\pythoncode\new\playsong.py

全部代碼

import os
import wx
import json
import pygame
from mutagen.mp3 import MP3
from mutagen.wave import WAVE

class MediaManagerApp(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='媒體文件管理器', size=(800, 600))
        
        # 初始化pygame mixer
        pygame.mixer.init()
        
        # 配置文件路徑
        self.config_path = 'favorites.json'
        
        # 創(chuàng)建面板
        panel = wx.Panel(self)
        
        # 垂直布局
        main_sizer = wx.BoxSizer(wx.VERTICAL)
        
        # 水平布局用于兩個(gè)ListBox
        list_sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        # 創(chuàng)建ListBox1(所有媒體文件)
        wx.StaticText(panel, label='所有媒體文件:')
        self.listbox1 = wx.ListBox(panel, style=wx.LB_MULTIPLE)
        list_sizer.Add(wx.StaticText(panel, label='所有媒體文件:'), 0, wx.ALL, 5)
        list_sizer.Add(self.listbox1, 1, wx.EXPAND | wx.ALL, 5)
        
        # 創(chuàng)建ListBox2(收藏文件)
        wx.StaticText(panel, label='收藏文件:')
        self.listbox2 = wx.ListBox(panel, style=wx.LB_MULTIPLE)
        list_sizer.Add(wx.StaticText(panel, label='收藏文件:'), 0, wx.ALL, 5)
        list_sizer.Add(self.listbox2, 1, wx.EXPAND | wx.ALL, 5)
        
        main_sizer.Add(list_sizer, 1, wx.EXPAND)
        
        # 進(jìn)度條
        self.progress_slider = wx.Slider(panel, style=wx.SL_HORIZONTAL | wx.SL_LABELS)
        main_sizer.Add(self.progress_slider, 0, wx.EXPAND | wx.ALL, 5)
        
        # 按鈕區(qū)域
        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
        
        # 選擇文件夾按鈕
        select_folder_btn = wx.Button(panel, label='選擇文件夾')
        select_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_folder)
        btn_sizer.Add(select_folder_btn, 0, wx.ALL, 5)
        
        # 收藏按鈕
        collect_btn = wx.Button(panel, label='收藏')
        collect_btn.Bind(wx.EVT_BUTTON, self.on_collect)
        btn_sizer.Add(collect_btn, 0, wx.ALL, 5)
        
        # 保存按鈕
        save_btn = wx.Button(panel, label='保存')
        save_btn.Bind(wx.EVT_BUTTON, self.on_save)
        btn_sizer.Add(save_btn, 0, wx.ALL, 5)
        
        # 加載按鈕
        load_btn = wx.Button(panel, label='加載')
        load_btn.Bind(wx.EVT_BUTTON, self.on_load)
        btn_sizer.Add(load_btn, 0, wx.ALL, 5)
        
        # 播放按鈕
        play_btn = wx.Button(panel, label='播放')
        play_btn.Bind(wx.EVT_BUTTON, self.on_play)
        btn_sizer.Add(play_btn, 0, wx.ALL, 5)
        
        # 停止按鈕
        stop_btn = wx.Button(panel, label='停止')
        stop_btn.Bind(wx.EVT_BUTTON, self.on_stop)
        btn_sizer.Add(stop_btn, 0, wx.ALL, 5)
        
        main_sizer.Add(btn_sizer, 0, wx.CENTER)
        
        panel.SetSizer(main_sizer)
        
        # 綁定滑動(dòng)條事件
        self.progress_slider.Bind(wx.EVT_SLIDER, self.on_slider_change)
        
        # 音頻播放相關(guān)變量
        self.current_track = None
        self.track_length = 0
        
        # 定時(shí)器用于更新進(jìn)度
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.update_progress, self.timer)
        
    def on_select_folder(self, event):
        # 選擇文件夾并列出媒體文件
        with wx.DirDialog(self, "選擇包含媒體文件的文件夾") as dirDialog:
            if dirDialog.ShowModal() == wx.ID_OK:
                folder_path = dirDialog.GetPath()
                self.listbox1.Clear()
                
                # 支持的媒體文件擴(kuò)展名
                media_extensions = ['.mp3', '.wav', '.ogg', '.flac']
                
                # 遍歷文件夾
                for filename in os.listdir(folder_path):
                    if os.path.splitext(filename)[1].lower() in media_extensions:
                        full_path = os.path.join(folder_path, filename)
                        self.listbox1.Append(full_path)
    
    def on_collect(self, event):
        # 將選中的文件從listbox1移動(dòng)到listbox2
        selections = self.listbox1.GetSelections()
        for index in reversed(selections):
            item = self.listbox1.GetString(index)
            self.listbox2.Append(item)
            self.listbox1.Delete(index)
    
    def on_save(self, event):
        # 將收藏的文件保存到配置文件
        favorites = [self.listbox2.GetString(i) for i in range(self.listbox2.GetCount())]
        with open(self.config_path, 'w', encoding='utf-8') as f:
            json.dump(favorites, f)
        wx.MessageBox('收藏已保存', '提示')
    
    def on_load(self, event):
        # 從配置文件加載收藏的文件
        try:
            with open(self.config_path, 'r', encoding='utf-8') as f:
                favorites = json.load(f)
            
            self.listbox2.Clear()
            for filepath in favorites:
                if os.path.exists(filepath):
                    self.listbox2.Append(filepath)
        except FileNotFoundError:
            wx.MessageBox('沒(méi)有找到收藏文件', '錯(cuò)誤')
    
    def on_play(self, event):
        # 播放選中的文件
        selections = self.listbox2.GetSelections()
        if selections:
            filepath = self.listbox2.GetString(selections[0])
            pygame.mixer.music.load(filepath)
            pygame.mixer.music.play()
            
            # 獲取音頻文件長(zhǎng)度
            if filepath.lower().endswith('.mp3'):
                audio = MP3(filepath)
                self.track_length = audio.info.length
            elif filepath.lower().endswith('.wav'):
                audio = WAVE(filepath)
                self.track_length = audio.info.length
            else:
                self.track_length = 0
            
            # 設(shè)置進(jìn)度條最大值
            self.progress_slider.SetRange(0, int(self.track_length))
            
            # 啟動(dòng)定時(shí)器更新進(jìn)度
            self.timer.Start(1000)  # 每秒更新
            
            self.current_track = filepath
    
    def on_stop(self, event):
        # 停止播放
        pygame.mixer.music.stop()
        self.timer.Stop()
        self.progress_slider.SetValue(0)
    
    def on_slider_change(self, event):
        # 拖動(dòng)進(jìn)度條
        if self.current_track:
            new_pos = self.progress_slider.GetValue()
            pygame.mixer.music.rewind()
            pygame.mixer.music.set_pos(new_pos)
    
    def update_progress(self, event):
        # 更新進(jìn)度條
        if pygame.mixer.music.get_busy():
            current_time = pygame.mixer.music.get_pos() / 1000  # 毫秒轉(zhuǎn)秒
            self.progress_slider.SetValue(int(current_time))

def main():
    app = wx.App()
    frame = MediaManagerApp()
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

技術(shù)選型

對(duì)于這個(gè)項(xiàng)目,我選擇了以下Python庫(kù):

wxPython:構(gòu)建跨平臺(tái)GUI界面

pygame:音頻播放和控制

mutagen:獲取音頻文件元數(shù)據(jù)

json:配置文件存儲(chǔ)

核心功能設(shè)計(jì)

1. 文件瀏覽與收藏

用戶可以輕松地:

  • 選擇文件夾
  • 瀏覽媒體文件列表
  • 快速將文件添加到收藏列表
  • 保存和加載收藏列表

2. 音頻播放控制

提供完整的播放體驗(yàn):

  • 播放選中的音頻文件
  • 停止當(dāng)前播放
  • 拖動(dòng)進(jìn)度條調(diào)節(jié)播放位置
  • 實(shí)時(shí)顯示播放進(jìn)度

關(guān)鍵代碼解析

文件遍歷

def on_select_folder(self, event):
    with wx.DirDialog(self, "選擇包含媒體文件的文件夾") as dirDialog:
        if dirDialog.ShowModal() == wx.ID_OK:
            folder_path = dirDialog.GetPath()
            # 遍歷支持的媒體文件
            media_extensions = ['.mp3', '.wav', '.ogg', '.flac']
            for filename in os.listdir(folder_path):
                if os.path.splitext(filename)[1].lower() in media_extensions:
                    full_path = os.path.join(folder_path, filename)
                    self.listbox1.Append(full_path)

音頻播放控制

def on_play(self, event):
    selections = self.listbox2.GetSelections()
    if selections:
        filepath = self.listbox2.GetString(selections[0])
        pygame.mixer.music.load(filepath)
        pygame.mixer.music.play()
        
        # 獲取音頻文件長(zhǎng)度
        audio = MP3(filepath) if filepath.lower().endswith('.mp3') else WAVE(filepath)
        self.track_length = audio.info.length
        
        # 設(shè)置進(jìn)度條
        self.progress_slider.SetRange(0, int(self.track_length))
        self.timer.Start(1000)

技術(shù)亮點(diǎn)

跨平臺(tái)GUI:使用wxPython確保應(yīng)用在Windows、Mac、Linux上都能運(yùn)行

靈活的文件管理:支持多種音頻格式

配置持久化:使用JSON保存收藏列表

實(shí)時(shí)進(jìn)度控制:通過(guò)定時(shí)器實(shí)現(xiàn)播放進(jìn)度追蹤

安裝與運(yùn)行

# 安裝依賴
pip install wxPython pygame mutagen

# 運(yùn)行應(yīng)用
python media_manager.py

使用場(chǎng)景

個(gè)人音樂(lè)收藏管理

音頻文件快速瀏覽

簡(jiǎn)單的本地音樂(lè)播放需求

未來(lái)改進(jìn)方向

添加播放列表功能

支持更多音頻格式

增加音量控制

實(shí)現(xiàn)歌詞顯示

運(yùn)行結(jié)果

結(jié)語(yǔ)

這個(gè)項(xiàng)目證明了Python強(qiáng)大的跨平臺(tái)開(kāi)發(fā)能力。短短200行代碼,我們就實(shí)現(xiàn)了一個(gè)功能完善的媒體管理播放器。對(duì)于想要定制音頻管理工具的開(kāi)發(fā)者來(lái)說(shuō),這是一個(gè)很好的起點(diǎn)。

到此這篇關(guān)于基于Python打造一個(gè)媒體管理播放器的文章就介紹到這了,更多相關(guān)Python媒體管理播放器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例

    Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例

    今天小編就為大家分享一篇Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Pygame實(shí)戰(zhàn)練習(xí)之紙牌21點(diǎn)游戲

    Pygame實(shí)戰(zhàn)練習(xí)之紙牌21點(diǎn)游戲

    21點(diǎn)想必是很多人童年時(shí)期的經(jīng)典游戲,我們依舊能記得抱個(gè)老人機(jī)娛樂(lè)的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于如何利用python寫一個(gè)簡(jiǎn)單的21點(diǎn)小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Python中的類屬性與實(shí)例屬性區(qū)別詳解

    Python中的類屬性與實(shí)例屬性區(qū)別詳解

    這篇文章主要介紹了Python中的類屬性與實(shí)例屬性區(qū)別詳解,類屬性是在類中定義的屬性,它是和這個(gè)類所綁定的,這個(gè)類中的所有對(duì)象都可以訪問(wèn),實(shí)例屬性是與類的實(shí)例相關(guān)聯(lián)的數(shù)據(jù)值,是這個(gè)實(shí)例私有的,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于Python字典的底層實(shí)現(xiàn)原理

    關(guān)于Python字典的底層實(shí)現(xiàn)原理

    這篇文章主要介紹了關(guān)于Python字典的底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python清華pip鏡像源報(bào)HTTP error 403錯(cuò)誤解決辦法

    python清華pip鏡像源報(bào)HTTP error 403錯(cuò)誤解決辦法

    這篇文章主要介紹了如何解決在使用pip安裝Python包時(shí)遇到的403錯(cuò)誤,提供了三種解決方法,并強(qiáng)調(diào)了清除緩存以使更改生效的重要性,需要的朋友可以參考下
    2024-12-12
  • python 模塊導(dǎo)入問(wèn)題匯總

    python 模塊導(dǎo)入問(wèn)題匯總

    在本篇文章里小編給大家整理的是一篇關(guān)于python 模塊導(dǎo)入問(wèn)題匯總內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • Python實(shí)現(xiàn)Canny及Hough算法代碼實(shí)例解析

    Python實(shí)現(xiàn)Canny及Hough算法代碼實(shí)例解析

    這篇文章主要介紹了Python實(shí)現(xiàn)Canny與Hough算法代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Python+?Flask實(shí)現(xiàn)Mock?Server詳情

    Python+?Flask實(shí)現(xiàn)Mock?Server詳情

    這篇文章主要介紹了Python+?Flask實(shí)現(xiàn)Mock?Server詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • pycharm打包python項(xiàng)目為exe執(zhí)行文件的實(shí)例代碼

    pycharm打包python項(xiàng)目為exe執(zhí)行文件的實(shí)例代碼

    這篇文章主要介紹了pycharm打包python項(xiàng)目為exe執(zhí)行文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Python中Get()函數(shù)用法舉例介紹

    Python中Get()函數(shù)用法舉例介紹

    這篇文章主要給大家介紹了關(guān)于Python中Get()函數(shù)用法的相關(guān)資料,Python get()函數(shù)是一個(gè)非常重要的函數(shù),它可以幫助我們從字典中獲取對(duì)應(yīng)鍵的值,避免了因?yàn)殒I不存在而發(fā)生錯(cuò)誤的情況,需要的朋友可以參考下
    2023-10-10

最新評(píng)論