【问题标题】:Can't call a function from class tkinter无法从类 tkinter 调用函数
【发布时间】:2017-06-17 10:04:14
【问题描述】:
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() missing 1 required positional argument: 'self'”是我一直遇到的错误,我不能在这个类中调用另一个类的函数,我该如何解决这个问题?我只想有一个按钮来创建一个条目,用户可以在其中输入链接并下载它。

【问题讨论】:

  • 您的 downloadVideo 方法不是静态的。您必须将其设为静态(方法上方的@staticmethod)或实例化该类的实例。

标签: python tkinter


【解决方案1】:

如果引用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() 中的字符串。

【讨论】:

  • 好的,我就是这样做的,尽管现在的问题似乎是它无法正确读取条目中的内容,因为它给出了错误“错误:''不是有效的 URL .",我该如何解决这个问题?
  • @Niko 我编辑了答案,get() 方法需要在视频请求之前调用。
【解决方案2】:

由于downloadVideoVideo 上的一个方法,您只需要创建一个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.v1 后设置 self.downloadUrl 大约 1 毫秒,因此它始终是空字符串。相反,您需要在您实际需要该值时调用v1.get(),该值位于downloadVideo 内部:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多