2017-06-17 62 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