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'”是我一直有的错误,我无法在此调用另一个类的函数,我该如何解决这个问题?我只想要一个创建条目的按钮,用户可以在其中输入链接并下载。
答案 0 :(得分: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()
内的字符串。
答案 1 :(得分:0)
由于downloadVideo
是Video
上的方法,您只需要创建Video
的实例,然后使用它来调用该函数。这与tkinter无关,这就是python类的工作方式。
例如:
video = Video()
menuOne.add_command(..., command=video.downloadVideo)
但是,Video
中还有另一个错误:
def __init__(self):
self.v1 = StringVar()
self.entry1 = Entry(root, textvariable=v1)
self.entry1.pack()
self.downloadUrl = v1.get()
您在创建self.downloadUrl
后约1毫秒设置self.v1
,因此它始终为空字符串。相反,您需要在实际需要值v1.get()
时调用downloadVideo
:
def downloadVideo(self):
ydl_opts = {}
url = self.v1.get()
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
self.ydl.download([url])