2016-12-25 32 views
0

Ich habe versucht, ein paar Zeilen Code, der eine YouTube-Video-URL URL und wandelt es in mp3/mp4 + 720p, und lädt dann es zu meinem DropBox-Musikordner.Übergeben einer URL durch das Eingabe-Widget (TKinter // Python 3+)

Wenn ich versuche, eine URL über ein TKinter-Widget (Eingabezeile) zu übergeben, treffe ich einen Fehler darüber, wie das Eintragsobjekt kein Attribut 'type' hat, oder dass die URL ungültig ist. Hat es etwas damit zu tun, dem youtube-Link keine Anführungszeichen oder etwas hinzuzufügen?

Wenn jemand irgendeine Einsicht hat, würde ich es sehr schätzen. Ich nehme an, ich vermisse etwas sehr Offensichtliches, aber ich kann nicht herausfinden, was genau.

#!/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

Veröffentlichen Sie den gesamten Traceback. – TigerhawkT3

+0

Beiseite: Verwenden Sie ['str.format'] (https://docs.python.org/3.4/library/stdtypes.html#str.format), um Strings zu verketten anstatt' + 'zu verwenden. –

+0

Datei "C: \ Python34 \ lib \ site-packages \ pytube \ api.py", Zeile 158, in from_url video_data = self.get_video_data() Datei "C: \ Python34 \ lib \ site-packages \ pytube \ api.py ", Zeile 254, in get_video_data Antwort = urlopen (self.url) Datei" C: \ Python34 \ lib \ urllib \ request.py ", Zeile 161, in urlopen zurück opener.open (URL, Daten , timeout) Datei "C: \ Python34 \ lib \ urllib \ request.py", Zeile 456, in geöffnet protocol = req.type AttributError: 'Entry' Objekt hat kein Attribut 'type' – Cooper

Antwort

1

Kurz gesagt, haben Sie die folgenden Schritte aus:

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

Sie dies erwartet ein Entry-Widget zu erstellen, rufen Sie dessen Inhalt und an den YouTube() Konstruktor, der abgerufenen Wert senden. So funktioniert es nicht. Sie erstellen gerade ein Entry Widget, sofort Abrufen seiner Inhalte, Wegwerfen dieser Inhalte (die sowieso leer sein wird, da zu diesem Zeitpunkt hatten Sie keine Chance, etwas in dieses Feld zu setzen), und dann versuchen zu senden das Entry Widget selbst zum YouTube() Konstruktor.

Darüber hinaus geben Sie das Entry Widget ein textvariable, aber dann verwenden Sie es nie.

Stattdessen den Inhalt dieses Entry Widget (über seine textvariable) innerhalb des Rückrufs abrufen. Sie können es sogar in dem Konstruktoraufruf YouTube() tun.

... 
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() 

Da Sie nichts Besonderes mit diesem Entry Widget tun, gibt es keine Notwendigkeit für eine überhaupt textvariable.

... 
top=tkinter.Tk() 

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

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

top.mainloop() 

Auch gibt es keine Notwendigkeit für ein nacktes return am Ende einer Funktion. Es wird zurückgegeben, sobald es nichts mehr zu tun gibt, mit einem Standard-Rückgabewert von None (das gleiche wie das, was mit einer blanken return Anweisung oder mit return None zurückgegeben wird).

+0

Danke, dass du dir die Zeit genommen hast, das zu erklären, jetzt verstehe ich, was ich getan habe (und ich fühle mich wirklich peinlich, weil ich nicht bemerkt habe, dass ich das Widget selbst aufgerufen habe). – Cooper