Python Can';t从类tkinter调用函数

Python Can';t从类tkinter调用函数,python,tkinter,Python,Tkinter,我正在尝试在菜单中创建一个按钮来下载视频。我在传递下载URL时遇到了麻烦,因为它不是一个全局变量。 我无法将命令本身放入类中,因为它甚至不会以这种方式创建。目前,“TypeError:downloadVideo()缺少1个必需的位置参数:'self'”是我一直遇到的错误,我无法在此中从另一个类调用函数,我如何解决这个问题?我只想有一个按钮,创建一个条目,用户可以输入链接并下载它 如果引用self是一个问题,您可以在类之外添加代码,例如: class Video: def __init__

我正在尝试在菜单中创建一个按钮来下载视频。我在传递下载URL时遇到了麻烦,因为它不是一个全局变量。
我无法将命令本身放入类中,因为它甚至不会以这种方式创建。目前,“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()
方法。