从 FLAC 文件获取封面图像并将其显示在 Tkinter 窗口上

问题描述

我正在尝试编写一个媒体播放器来学习和练习 Python,我目前正在尝试做的是在一个窗口中显示 FLAC 文件的封面,并设法与媒体播放器分开执行此操作代码:

from mutagen.flac import FLAC,Picture
from tkinter import * 
import tkinter as tk
from tkinter.ttk import *
from PIL import ImageTk,Image
import os.path


root = Tk()
root.geometry("500x500")
cont1 = 0


songs = ['03 - Vimana.flac','Haddaway - What Is Love (70 Mix).flac']

def  getCoverFlac(flac_file):
    flacObj = FLAC(flac_file)
    coverArt = flacObj.pictures
    coverName = str(flac_file)+"Cover.jpg"
    if os.path.isfile(coverName):
        print(coverName+" already exists")
    else:
        for img in coverArt:
            if img.type == 3:
                with open(coverName,"wb") as f:
                    f.write(img.data)
                print(coverName+" created and saved")
    return coverName


img = ImageTk.PhotoImage(Image.open(getCoverFlac(songs[1])))
panel = tk.Label(root,image = img)
panel.pack(side = "bottom",fill = "both",expand = "yes")
root.mainloop()   

当我尝试将这个函数与下面的媒体播放器代码一起使用时,真正的问题就开始了,试图调整我的函数,使封面图像可以像 song_title 标签一样工作,我认为问题是这样的一段代码:

img = ImageTk.PhotoImage(Image.open(getCoverFlac(var.get())))

我认为因为当 var 为空时它会被执行,我的函数不知道如何处理它(试图在函数内部为此设置条件,但它仍然无法' t 返回 coverName),所以我想知道我应该更改或学习什么来实现显示正在播放的歌曲名称 + 其封面的目标。 完整代码如下:

import pygame
import tkinter as tkr
from tkinter.filedialog import askdirectory
import os
from mutagen.flac import FLAC,Picture
import os.path
from PIL import ImageTk,Image

music_player = tkr.Tk()
cont = 0
music_player.title("My Music Player")
music_player.geometry("600x600")
play_list = tkr.Listbox(music_player,font="Helvetica 12 bold",bg='yellow',selectmode=tkr.SINGLE)


pygame.init()
pygame.mixer.init()

def play():
    pygame.mixer.music.load(play_list.get(tkr.ACTIVE))
    var.set(play_list.get(tkr.ACTIVE))
    pygame.mixer.music.play()
    print(var.get())
def stop():
    pygame.mixer.music.stop()
def pause():
    pygame.mixer.music.pause()
def unpause():
    pygame.mixer.music.unpause()
def selectDir():
    directory = askdirectory()
    os.chdir(directory)
    song_list = os.listdir()
    
    
    for item in song_list:
        pos = 0
        play_list.insert(pos,item)
        pos += 1
def  getCoverFlac(flac_file):
        flacObj = FLAC(flac_file)
        coverArt = flacObj.pictures
        coverName = str(flac_file)+"Cover.jpg"
        if os.path.isfile(coverName):
            print(coverName+" already exists")
        else:
            for img in coverArt:
                if img.type == 3:
                    with open(coverName,"wb") as f:
                        f.write(img.data)
                    print(coverName+" created and saved")
        return coverName
    

Button1 = tkr.Button(music_player,width=5,height=3,text="PLAY",command=play,bg="blue",fg="white")
Button2 = tkr.Button(music_player,text="STOP",command=stop,bg="red",fg="white")
Button3 = tkr.Button(music_player,text="PAUSE",command=pause,bg="purple",fg="white")
Button4 = tkr.Button(music_player,text="UNPAUSE",command=unpause,bg="orange",fg="white")
Button5 = tkr.Button(music_player,text="Music Dir",command=selectDir,bg="green",fg="white")



var = tkr.StringVar() 

song_title = tkr.Label(music_player,textvariable=var)

if var.get == "":
    img = ImageTk.PhotoImage(Image.open('romani.gif'))
else:
    img = ImageTk.PhotoImage(Image.open(getCoverFlac(var.get())))
    
panel = tkr.Label(music_player,image = img)

song_title.pack()
panel.pack(fill="x")
Button1.pack(fill="x")
Button2.pack(fill="x")
Button3.pack(fill="x")
Button4.pack(fill="x")
Button5.pack(fill="x")
play_list.pack(fill="both",expand="yes")
music_player.mainloop()

我最后一次尝试解决这个问题是:

if var.get == "":
    img = ImageTk.PhotoImage(Image.open('romani.gif'))
else:
    img = ImageTk.PhotoImage(Image.open(getCoverFlac(var.get())))

控制台输出:

Traceback (most recent call last):
  File "C:\Users\abrah\AppData\Local\Programs\Python\Python39\lib\site-packages\mutagen\_util.py",line 251,in _openfile
    fileobj = open(filename,"rb+" if writable else "rb")
FileNotFoundError: [Errno 2] No such file or directory: ''

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "d:\Code\python\Media player\mediap.py",line 70,in <module>
    img = ImageTk.PhotoImage(Image.open(getCoverFlac(var.get())))
  File "d:\Code\python\Media player\mediap.py",line 41,in getCoverFlac
    flacObj = FLAC(flac_file)
  File "C:\Users\abrah\AppData\Local\Programs\Python\Python39\lib\site-packages\mutagen\_file.py",line 48,in __init__
    self.load(*args,**kwargs)
  File "C:\Users\abrah\AppData\Local\Programs\Python\Python39\lib\site-packages\mutagen\_util.py",line 185,in wrapper
    return func(*args,line 154,in wrapper
    with _openfile(self,filething,filename,fileobj,File "C:\Users\abrah\AppData\Local\Programs\Python\Python39\lib\contextlib.py",line 117,in __enter__
    return next(self.gen)
  File "C:\Users\abrah\AppData\Local\Programs\Python\Python39\lib\site-packages\mutagen\_util.py",line 272,in _openfile
    raise MutagenError(e)
mutagen.MutagenError: [Errno 2] No such file or directory: ''

这可能是一种凌乱的提问方式,我事先向那些花时间阅读的人道歉,这是我第一次尝试在学校作业之外做一个项目,我被打败了,不知道我到底是什么问题,所以我不知道什么是正确的问题,所以我更愿意解释我想要做什么,我做了什么,我得到了什么,感谢您的时间。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...