2016-12-25 47 views
0

我一直在試圖把幾行代碼放在一起,它需要一個YouTube音樂視頻URL並將其轉換爲mp3/mp4 + 720p,然後下載它到我的DropBox音樂文件夾。通過入口小部件傳遞一個URL(TKinter // Python 3+)

當我試圖通過使用TKinter部件(輸入欄)傳遞一個URL我打有關的條目對象如何有沒有屬性「類型」,或該網址是無效的錯誤。這是否與不向youtube鏈接添加引號或什麼?

如果有人有任何見解,我將不勝感激。我想我錯過了一些非常明顯的東西,但我似乎無法弄清楚究竟是什麼。

#!/usr/bin/env python 
import sys 
import os 
import tkinter 
from pytube import * 
from tkinter import * 

top=tkinter.Tk() 
yt_variable = StringVar() 

def helloCallBack(): 
    #Select youtube link you want to upload and print contents 
    yt = YouTube(yt_entry) 
    print(yt.get_videos()) 
    print(yt.filename)  
    #Set parameters for youtube video 
    video = yt.get('mp4', '720p') 
    print(yt.videos) 
    print("success") 

    #Select download location for youtube video 
    video.download('C:/Users/coope/Dropbox/BrokenBow/Music/') 
    print("Downloaded " + str(yt.filename) + " to " + str(video.download) + " successfully!") 
    return 

yt_label=tkinter.Label(top,text='Paste Link + Press Go') 
yt_label.pack() 
yt_button=tkinter.Button(top,text='Go',command= helloCallBack) 
yt_button.pack() 
yt_entry=tkinter.Entry(top, textvariable=yt_variable) 
yt_entry.get() 
yt_entry.pack() 

top.mainloop() 
+0

發佈整個回溯。 – TigerhawkT3

+0

另外:使用['str.format'](https://docs.python.org/3.4/library/stdtypes.html#str.format)連接字符串而不是使用'+'。 –

+0

文件「C:\ Python34 \ lib \ site-packages \ pytube \ api.py」,行158,from_url video_data = self.get_video_data() 文件「C:\ Python34 \ lib \ site-packages \ pytube \ api.py「,第254行,在get_video_data中 response = urlopen(self.url) 文件」C:\ Python34 \ lib \ urllib \ request.py「,第161行,在urlopen中 return opener.open(url,data ,超時) 文件「C:\ Python34 \ lib \ urllib \ request.py」,第456行打開 protocol = req.type AttributeError:'Entry'對象沒有'type'屬性 – Cooper

回答

1

簡而言之,您具備以下條件:

yt_entry=tkinter.Entry(top, textvariable=yt_variable) 
yt_entry.get() 
yt = YouTube(yt_entry) 

你期待它來創建一個Entry小部件,其內容檢索,而檢索到的值發送到YouTube()構造。它不這樣工作。你實際上創建了一個Entry小部件,立即檢索其內容,扔掉那些內容(無論如何,這是空的,因爲到那時你還沒有機會將任何東西放入該字段),然後嘗試發送Entry小部件本身構造函數爲YouTube()

最重要的是,你給Entry小部件textvariable,但你永遠不會使用它。

取而代之的是,在回調中檢索該Entry小部件的內容(通過它的textvariable)。你甚至可以在構造函數YouTube()中調用它。

... 
top=tkinter.Tk() 
yt_variable = StringVar() 

def helloCallBack(): 
    ... 
    yt = YouTube(yt_variable.get()) 
    ... 

... 
yt_entry=tkinter.Entry(top, textvariable=yt_variable) 
yt_entry.pack() 

top.mainloop() 

因爲你沒有做什麼特別的東西與Entry部件,沒有必要爲textvariable在所有。

... 
top=tkinter.Tk() 

def helloCallBack(): 
    ... 
    yt = YouTube(yt_entry.get()) 
    ... 

... 
yt_entry=tkinter.Entry(top,) 
yt_entry.pack() 

top.mainloop() 

而且,沒有必要對裸return在函數結束。無論什麼時候沒有更多事情要做,它將返回,默認返回值爲None(與使用裸return聲明或return None返回的值相同)。

+0

感謝您花時間解釋這一點,現在我明白我在做什麼(並且我感到非常尷尬,因爲沒有意識到我只是在調用小部件本身)。 – Cooper