无法从类tkinter

时间:2017-06-17 10:04:15

标签: python tkinter

class Video:
    def __init__(self):
        self.v1 = StringVar()    
        self.entry1 = Entry(root, textvariable=v1)
        self.entry1.pack()
        self.downloadUrl = v1.get()
    def downloadVideo(self):

        ydl_opts = {}
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
                self.ydl.download([self.downloadUrl])
menu = Menu(root)
root.config(menu=menu)    
menuOne = Menu(menu, tearoff=0)
menu.add_cascade(label='Magrobebi', menu=menuOne)   
menuOne.add_command(label='Download Video', command=Video.downloadVideo)

我正在尝试在菜单中创建一个下载视频的按钮。我一直无法传递downloadUrl,因为它不是一个全局变量。 我无法将命令本身放在类中,因为它甚至不会以这种方式创建。目前,“TypeError:downloadVideo()缺少1个必需的位置参数:'self'”是我一直有的错误,我无法在此调用另一个类的函数,我该如何解决这个问题?我只想要一个创建条目的按钮,用户可以在其中输入链接并下载。

2 个答案:

答案 0 :(得分:0)

如果引用self是个问题,您可以在类之外添加代码,例如:

from tkinter import *
import youtube_dl

root = Tk()

v1 = StringVar()    
entry1 = Entry(root, textvariable=v1)
entry1.pack()

def downloadVideo():
    downloadUrl = v1.get()
    ydl_opts = {}
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            ydl.download(downloadUrl)

menu = Menu(root)
root.config(menu=menu)    
menuOne = Menu(menu, tearoff=0)
menu.add_cascade(label='Magrobebi', menu=menuOne)   
menuOne.add_command(label='Download Video', command=downloadVideo)

root.mainloop()

这会生成一个带有按钮的窗口,按下该按钮时,会提供下载视频的选项,并在其下方输入一个条目。

编辑:downloadUrl = v1.get()需要downloadVideo(),因为.get()会立即检索StringVar()内的字符串。

答案 1 :(得分:0)

由于downloadVideoVideo上的方法,您只需要创建Video的实例,然后使用它来调用该函数。这与tkinter无关,这就是python类的工作方式。

例如:

video = Video()
menuOne.add_command(..., command=video.downloadVideo)

但是,Video中还有另一个错误:

def __init__(self):
    self.v1 = StringVar()    
    self.entry1 = Entry(root, textvariable=v1)
    self.entry1.pack()
    self.downloadUrl = v1.get()

您在创建self.downloadUrl后约1毫秒设置self.v1,因此它始终为空字符串。相反,您需要在实际需要值v1.get()时调用downloadVideo

def downloadVideo(self):
    ydl_opts = {}
    url = self.v1.get()
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            self.ydl.download([url])