python - 我正在尝试使用 Python 制作音乐应用程序但我遇到了一个无法修复的错误
问题描述
我正在尝试使用 python 为我的 12 年级项目制作一个音乐应用程序,但我遇到了一个错误,我不知道如何修复。我要做的是用GUI制作功能齐全的类似应用程序的python程序,并且能够播放在线和离线音乐。
最初,我只从一个程序开始,我们可以在其中搜索并找到 Youtube 中的第一个结果,然后播放、暂停和停止。后来我对其进行了改进,以便我们可以在 Youtube 中播放前 10 个结果。实际上,我从堆栈溢出本身中得到了搜索和查找部分的想法(顺便说一句,这非常有帮助)并从中开发了其余代码。我们也可以播放/暂停/停止音乐。但我希望它看起来更好,所以...我使用 tkinter 添加了一个 GUI,起初这很困难,但很快就很容易了。我现在可以做的是在 Tkinter 窗口和搜索按钮中输入音乐名称(添加了搜索按钮,因此当我按下它时它将运行“链接查找和播放程序”)。我现在使用的库是:
- 要求。
- 帕菲
- python-vlc
- tkinter
程序代码:
from tkinter import *
import re,requests, urllib.parse, urllib.request
import vlc
import pafy
root = Tk()
root.geometry('475x225'); root.title('PyMu6')
Entry = Entry(root, width=26,font=('Circular',13))
Entry.place(x=127,y=17)
def search():
music_name = Entry.get()
print(music_name)
if type(music_name)==str:
query_string = urllib.parse.urlencode({"search_query": music_name})
formatUrl = urllib.request.urlopen("https://www.youtube.com/results?" + query_string)
search_results = re.findall(r"watch\?v=(\S{11})", formatUrl.read().decode())
clip = requests.get("https://www.youtube.com/watch?v=" + "{}".format(search_results[0]))
clip1 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[0])
clip2 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[1])
clip3 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[2])
clip4 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[3])
clip5= "https://www.youtube.com/watch?v=" + "{}".format(search_results[4])
clip6 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[5])
clip7 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[6])
clip8 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[7])
clip9 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[8])
clip10 = "https://www.youtube.com/watch?v=" + "{}".format(search_results[9])
title1 = pafy.new(clip1)
title2 = pafy.new(clip2)
title3 = pafy.new(clip3)
title4 = pafy.new(clip4)
title5 = pafy.new(clip5)
title6 = pafy.new(clip6)
title7 = pafy.new(clip7)
title8 = pafy.new(clip8)
title9 = pafy.new(clip9)
title10 = pafy.new(clip10)
video1 = title1.title
video2 = title2.title
video3 = title3.title
video4 = title4.title
video5 = title5.title
video6 = title6.title
video7 = title7.title
video8 = title8.title
video9 = title9.title
video10 = title10.title
Label(root,text=video1,fg='blue').place(x=60,y=70)
print()
print('1)', video1)
print('2)', video2)
print('3)', video3)
print('4)', video4)
print('5)', video5)
print('6)', video6)
print('7)', video7)
print('8)', video8)
print('9)', video9)
print('10)', video10)
print()
e = input('Enter Song: ')
if e == '1':
print(clip1)
url = clip1
if e == '2':
print(clip2)
url = clip2
if e == '3':
print(clip2)
url = clip3
if e == '4':
print(clip4)
url = clip4
if e == '5':
print(clip5)
url = clip5
if e == '6':
print(clip6)
url = clip6
if e == '7':
print(clip7)
url = clip7
if e == '8':
print(clip8)
url = clip8
if e == '9':
print(clip9)
url = clip9
if e == '10':
print(clip10)
url = clip10
video = pafy.new(url)
best = video.getbest()
media = vlc.MediaPlayer(best.url)
titl = video.title
print(titl)
media.play()
def play():
media.play()
def pause():
media.pause()
def stop():
media.stop()
Search_button = Button(root, text = 'Search', width = 10, font = ('Circular.', 10),bg='#1DB954',command=MusicPlayer.search)
Play = Button(root, text = 'Play', width = 10,font = ('Circular.', 10),bg='#1DB954',command=play)
Pause = Button(root,text = 'Pause', width = 10, font = ('Circular.', 10),bg='#1DB954',command=pause)
Stop = Button(root,text = 'Stop', width = 10, font = ('Circular.',10),bg='#1DB954',command=stop)
Search_button.place(x=380,y=15);Play.place(x=120,y=170);Pause.place(x=220,y=170);Stop.place(x=320,y=170)
root.mainloop()
这段代码工作得很好,直到暂停/播放/停止按钮的地方。每当我尝试按下这些按钮时,我都会收到 ValueError: name 'media' is not defined。 这是我得到的错误图像的链接。我认为的问题是因为我正在尝试使用不在其缩进(媒体)之下的东西。
我还尝试了其他返回此媒体属性的方法,但它们似乎对我不起作用。所以,如果有人可以帮助我解决这个错误并修复它,那就太好了。另外,我欢迎您对该程序提出任何建议。
谢谢
斯里拉姆
解决方案
在函数中,创建media
全局变量。但是使用起来global
很糟糕。您可以使用 OOP 方法,您可以在函数内的任何位置访问实例变量,前提是它已定义
global media
media = vlc.MediaPlayer(best.url)