首页 > 解决方案 > 我正在尝试使用 Python 制作音乐应用程序但我遇到了一个无法修复的错误

问题描述

我正在尝试使用 python 为我的 12 年级项目制作一个音乐应用程序,但我遇到了一个错误,我不知道如何修复。我要做的是用GUI制作功能齐全的类似应用程序的python程序,并且能够播放在线和离线音乐。

最初,我只从一个程序开始,我们可以在其中搜索并找到 Youtube 中的第一个结果,然后播放、暂停和停止。后来我对其进行了改进,以便我们可以在 Youtube 中播放前 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: name 'media' is not defined。 这是我得到的错误图像的链接。我认为的问题是因为我正在尝试使用不在其缩进(媒体)之下的东西。

这是播放器工作时

我还尝试了其他返回此媒体属性的方法,但它们似乎对我不起作用。所以,如果有人可以帮助我解决这个错误并修复它,那就太好了。另外,我欢迎您对该程序提出任何建议。

谢谢

斯里拉姆

标签: pythonuser-interfacetkinter

解决方案


在函数中,创建media全局变量。但是使用起来global很糟糕。您可以使用 OOP 方法,您可以在函数内的任何位置访问实例变量,前提是它已定义

global media
media = vlc.MediaPlayer(best.url)

推荐阅读