You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Kivy开发YT视频下载器,输入链接提交后报AttributeError怎么解决?

问题排查与修复方案

错误根因

ids属性是KV文件加载完成后,挂载在根组件实例上的,App类本身不自带ids,你直接调用self.ids.txt就会触发AttributeError。另外你代码中定义的txt ObjectProperty没有和KV中的输入框绑定,属于无效声明。

修复方案

方案1:直接引用根组件获取输入值

修改build方法存储根组件实例,再从根组件的ids中取输入框内容,修改后的完整代码如下:

from kivymd.app import MDApp
from kivy.lang import Builder
from pytube import YouTube

kv = """
Screen:

    MDLabel:
        text: 'YT Video Downloader'
        font_style: 'H2'
        pos_hint: {'center_x': 0.6, 'center_y': 0.8}

    MDTextField:
        id: txt
        hint_text: 'Enter the url of your video'
        pos_hint: {'center_x': 0.5, 'center_y': 0.4}
        size_hint_x: None
        width: 300
        icon_right: 'youtube'


    MDRectangleFlatButton:
        text: 'Submit'
        pos_hint: {'center_x': 0.5, 'center_y': 0.3}
        on_press:
            app.download()
"""


class Main(MDApp):
    def build(self):
        # 存储根组件实例
        self.root_screen = Builder.load_string(kv)
        return self.root_screen

    def download(self):
        # 从根组件的ids中取输入框文本
        url = self.root_screen.ids.txt.text
        video = YouTube(url)
        video_streams = video.streams.filter(file_extension='mp4').get_by_itag(18)
        video_streams.download()


Main().run()

方案2:通过ObjectProperty绑定组件(更规范)

将KV中的输入框和App类的txt属性绑定,后续可以直接调用属性获取内容,修改后的完整代码如下:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from pytube import YouTube

kv = """
Screen:
    # 绑定输入框到App的txt属性
    app.txt: txt

    MDLabel:
        text: 'YT Video Downloader'
        font_style: 'H2'
        pos_hint: {'center_x': 0.6, 'center_y': 0.8}

    MDTextField:
        id: txt
        hint_text: 'Enter the url of your video'
        pos_hint: {'center_x': 0.5, 'center_y': 0.4}
        size_hint_x: None
        width: 300
        icon_right: 'youtube'


    MDRectangleFlatButton:
        text: 'Submit'
        pos_hint: {'center_x': 0.5, 'center_y': 0.3}
        on_press:
            app.download()
"""


class Main(MDApp):
    txt = ObjectProperty(None)

    def build(self):
        return Builder.load_string(kv)

    def download(self):
        # 直接取绑定好的属性的text值
        url = self.txt.text
        video = YouTube(url)
        video_streams = video.streams.filter(file_extension='mp4').get_by_itag(18)
        video_streams.download()


Main().run()

额外优化建议

可以在download方法中增加异常捕获逻辑,处理网络异常、链接无效、下载失败等场景,避免程序直接崩溃。

内容的提问来源于stack exchange,提问作者Gourav Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:09:00