我正在尝试用python制作一个音乐应用程序,用于我的12年级项目,但我得到了一个错误,我不知道如何修复。我要做的是用GUI制作功能齐全的类似应用程序的python程序,并且能够同时播放在线和离线音乐。
起初,我只是从一个程序开始,在这个程序中,我们可以搜索并找到Youtube上出现的第一个结果,然后播放、暂停并停止它。我后来对此进行了改进,这样我们就可以在Youtube.I中播放前10个结果,我实际上有了从堆栈溢出本身搜索和查找部件的想法(顺便说一句,这是非常有用的。)并从中开发了其余的代码。我们也可以播放/暂停/停止音乐。但我希望它看起来更好,所以.我使用tkinter添加了一个GUI,这在一开始是相当困难的,但很快就足够容易了。我现在能做的就是在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:未定义名称'media‘。这是我得到的错误图像的链接。.The问题,我认为是因为我试图使用的东西不是它的缩进(媒体)。
我也尝试过其他方法来返回这个媒体属性,但它们似乎对我不起作用。所以,如果有人能帮我解决这个错误并修复it.Also,那就太好了,欢迎你对这个程序提出任何建议。
谢谢
斯里拉姆
发布于 2021-08-12 15:11:59
在函数中,使media全局变量。然而,使用global是不好的。您可以使用OOP方法,在该方法中,只要定义了实例变量,就可以在函数的任何地方访问它。
global media
media = vlc.MediaPlayer(best.url)发布于 2021-08-12 15:06:56
我不知道这是否有效,但尝试在def中传递媒体值,例如:
def play(media):
media.play()发布于 2021-08-12 15:47:07
您可以在search()之外创建media.set_mrl(),并在search()中使用media.set_mrl():
media = vlc.MediaPlayer()
def search():
...
best = video.getbest()
media.set_mrl(best.url)
...https://stackoverflow.com/questions/68759818
复制相似问题