Python Can';t从类tkinter调用函数
我正在尝试在菜单中创建一个按钮来下载视频。我在传递下载URL时遇到了麻烦,因为它不是一个全局变量。Python Can';t从类tkinter调用函数,python,tkinter,Python,Tkinter,我正在尝试在菜单中创建一个按钮来下载视频。我在传递下载URL时遇到了麻烦,因为它不是一个全局变量。 我无法将命令本身放入类中,因为它甚至不会以这种方式创建。目前,“TypeError:downloadVideo()缺少1个必需的位置参数:'self'”是我一直遇到的错误,我无法在此中从另一个类调用函数,我如何解决这个问题?我只想有一个按钮,创建一个条目,用户可以输入链接并下载它 如果引用self是一个问题,您可以在类之外添加代码,例如: class Video: def __init__
我无法将命令本身放入类中,因为它甚至不会以这种方式创建。目前,“TypeError:downloadVideo()缺少1个必需的位置参数:'self'”是我一直遇到的错误,我无法在此中从另一个类调用函数,我如何解决这个问题?我只想有一个按钮,创建一个条目,用户可以输入链接并下载它 如果引用
self
是一个问题,您可以在类之外添加代码,例如:
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)
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()
中的字符串。因为downloadVideo
是Video
上的一种方法,您只需创建一个Video
实例,然后使用它调用函数。这与tkinter无关,这只是python类的工作方式
例如:
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)
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()
但是,您在视频中有另一个bug,您可以在其中执行以下操作:
video = Video()
menuOne.add_command(..., command=video.downloadVideo)
您在创建self.v1
后约1毫秒设置self.downloadUrl
,因此它将始终是空字符串。相反,您需要在实际需要值时调用v1.get()
,该值位于downloaddvideo
中:
def __init__(self):
self.v1 = StringVar()
self.entry1 = Entry(root, textvariable=v1)
self.entry1.pack()
self.downloadUrl = v1.get()
您的下载视频方法不是静态的。你要么让它成为静态的(@staticmethod在方法上方),要么实例化该类的一个实例。好吧,我就是这样做的,尽管现在的问题似乎是它无法正确读取条目中的内容,考虑到它给出了一个错误“错误:“”不是有效的URL。”,我该如何解决这个问题呢?@Niko我编辑了答案,需要在请求视频之前调用get()
方法。