2017-06-17 60 views
0
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'”是我一直有的错误,我无法从另一个类中调用函数,我该如何解决这个问题?我只想创建一个按钮来创建一个用户可以输入链接并下载它的条目。无法从类tkinter调用函数

+1

你downloadVideo方法也不是一成不变的。您必须将其设置为静态(方法上方的@staticmethod)或实例化该类的实例。 –

回答

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()内的字符串。

+0

好吧,我这样做,虽然现在的问题似乎是它不能正确读取条目中的内容,因为它给出了一个错误“错误:”不是一个有效的URL。“,我该如何工作在这附近? – Niko

+0

@Niko我编辑了答案,需要在请求视频之前调用get()方法。 –

+0

哦,上帝保佑它终于被修好了,非常感谢!:D – Niko

0

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

例如:

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

然而,你必须在Video另一个bug你这样做,其中:

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

你正在创建self.v1后设置self.downloadUrl约1个毫秒,因此将永远是空字符串。相反,你需要在你实际需要的值的时间,这是downloadVideo内部调用v1.get()

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

工作得很好,谢谢! :d – Niko