2017-06-17 4 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) 

Ich versuche, eine Schaltfläche im Menü erstellen, die ein Video herunterladen wird. Ich habe Probleme, dieses DownloadUrl herumzugeben, da es keine globale Variable ist. Ich kann den Befehl selbst nicht in die Klasse einfügen, weil er nicht auf diese Weise erstellt wird. Momentan, "TypeError: downloadVideo() fehlt 1 benötigt positional argument: 'self'" ist der Fehler, den ich habe, kann ich nicht eine Funktion aus einer anderen Klasse in diesem, wie komme ich um diese? Ich möchte nur eine Schaltfläche, die einen Eintrag erstellt, wo der Benutzer einen Link eingeben und herunterladen kann.Kann keine Funktion aus der Klasse tkinter aufrufen

+1

Ihre Downloadvideos Methode nicht statisch ist. Sie müssen es entweder statisch machen (@staticmethod über der Methode) oder eine Instanz dieser Klasse instanziieren. –

Antwort

0

Wenn Referenzierung auf self ein Problem ist, Sie den Code außerhalb der Klasse hinzufügen können, zum Beispiel:

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

Dies erzeugt ein Fenster mit einer Taste, die, wenn sie gedrückt, gibt eine Option, um das Video zum Download und darunter ein Eingabefeld.

EDIT: Die downloadUrl = v1.get() im Aufruf werden müssen downloadVideo() als .get() ruft die Zeichenfolge innerhalb der StringVar() sofort.

+0

Okay, ich habe es so gemacht, obwohl das Problem im Moment scheint, dass es nicht lesen kann, was in dem Eintrag richtig ist, in Anbetracht dessen gibt es einen Fehler "FEHLER: '' ist keine gültige URL.", Wie kann ich arbeiten um das herum? – Niko

+0

@Niko Ich habe die Antwort bearbeitet, die 'get()' Methode musste kurz vor der Anfrage für das Video aufgerufen werden. –

+0

Oh Gott, es ist endlich behoben, vielen Dank!: D – Niko

0

Da downloadVideo eine Methode auf Video ist, müssen Sie einfach eine Instanz von Video erstellen und sie dann verwenden, um die Funktion aufzurufen. Das hat nichts mit tkinter zu tun, so funktionieren Python-Klassen einfach.

Zum Beispiel:

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

Sie haben jedoch einen anderen Fehler in Video wo Sie dies tun:

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

Du self.downloadUrl etwa 1 Millisekunde Einstellung nach self.v1 Erstellung so wird es immer sein, die leerer String. Stattdessen müssen Sie v1.get() zu dem Zeitpunkt nennen, die Sie den Wert tatsächlich benötigen, die sich innerhalb von downloadVideo ist:

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

Das hat auch funktioniert, danke! : D – Niko

Verwandte Themen