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

Kivy开发:如何从kv文件的MDTextField获取文本传入下载函数

解决KivyMD中获取MDTextField内容并传入下载函数的问题

你需要将MP3和MP4界面中MDTextField的内容传递到main.py的下载函数中,以下是具体修改方案:

1. 修改KV文件的按钮回调

在MP3Screen.kv和MP4Screen.kv中,修改下载按钮的on_press事件,直接将MDTextField的文本作为参数传入下载函数:

MP3Screen.kv 修改后

MDScreen:
    name: "MP3Screen"
    md_bg_color: [64/255, 66/255, 88/255, 1]

    MDRaisedButton:
        text: "Download"
        font_size : 20
        md_bg_color: 0,0,0,1
        pos_hint : {"center_x": .5, "center_y": .6}
        width : 150
        on_press : app.download_mp3(data.text)  # 传入输入框文本

    MDRaisedButton:
        text: "GO BACK"
        font_size : 20
        md_bg_color : 0,0,0,1
        pos_hint : {"center_x": .5, "center_y": .52}
        width: 150
        on_press: app.change_screen("MainScreen")

    MDTextField:
        id: data
        hint_text: "Paste the YouTube video URL Here"
        pos_hint: {"center_x":.5,"center_y":.7}
        width: 300
        size_hint : None,None
        font_size : "15dp"
        line_color_focus : 0/255,0/255,0/255,1
        mode : "rectangle"
        pos : 93,280

MP4Screen.kv 修改后

MDScreen:
    name: "MP4Screen"
    md_bg_color: [64/255, 66/255, 88/255, 1]

    MDRaisedButton:
        text: "Download"
        font_size : 20
        md_bg_color: 0,0,0,1
        pos_hint : {"center_x": .5, "center_y": .6}
        width : 150
        on_press : app.download_mp4(data.text)  # 传入输入框文本

    MDRaisedButton:
        text: "GO BACK"
        font_size : 20
        md_bg_color : 0,0,0,1
        pos_hint : {"center_x": .5, "center_y": .52}
        width: 150
        on_press: app.change_screen("MainScreen")

    MDTextField:
        id: data
        hint_text: "Paste the YouTube video URL Here"
        pos_hint: {"center_x":.5,"center_y":.7}
        width: 300
        size_hint : None,None
        font_size : "15dp"
        line_color_focus : 0/255,0/255,0/255,1
        mode : "rectangle"
        pos : 93,280

2. 修改main.py中的函数实现

修正类方法参数,接收传入的URL并补充下载逻辑:

main.py 修改后

from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager  
from kivymd.app import MDApp
from kivy.core.window import Window
import requests
import youtube_dl

Window.size = (350, 600)

class MainApp(MDApp):
    screen_manager = ScreenManager()

    def build(self):
        self.title = "Yahiatube"
        self.theme_cls.primary_palette = 'BlueGray'

        self.screen_manager.add_widget(Builder.load_file("mainScreen.kv"))
        self.screen_manager.add_widget(Builder.load_file("MP3Screen.kv"))
        self.screen_manager.add_widget(Builder.load_file("MP4Screen.kv"))

        return self.screen_manager

    def check_video_url(self, video_url):
        checker_url = "https://www.youtube.com/oembed?url="
        request_url = checker_url + video_url
        request = requests.get(request_url)
        return request.status_code == 200

    def download_mp3(self, url):
        if not url:
            print("请输入YouTube视频URL")
            return
        if self.check_video_url(url):
            print(f"开始下载MP3:{url}")
            # 配置youtube_dl的MP3下载参数
            ydl_opts = {
                'format': 'bestaudio/best',
                'postprocessors': [{
                    'key': 'FFmpegExtractAudio',
                    'preferredcodec': 'mp3',
                    'preferredquality': '192',
                }],
            }
            with youtube_dl.YoutubeDL(ydl_opts) as ydl:
                ydl.download([url])
        else:
            print("无效的YouTube视频URL")
        
    def download_mp4(self, url):
        if not url:
            print("请输入YouTube视频URL")
            return
        if self.check_video_url(url):
            print(f"开始下载MP4:{url}")
            # 配置youtube_dl的MP4下载参数
            ydl_opts = {
                'format': 'bestvideo+bestaudio/best',
            }
            with youtube_dl.YoutubeDL(ydl_opts) as ydl:
                ydl.download([url])
        else:
            print("无效的YouTube视频URL")

    def change_screen(self, screen):
        self.screen_manager.current = screen

if __name__ == "__main__":
    MainApp().run()

关键修改说明

  • KV文件中,通过data.text直接获取MDTextField的输入内容,作为参数传递给下载函数
  • main.py中,所有类方法添加self参数,确保能访问类属性和其他方法
  • 新增空值检查和URL有效性验证,避免无效输入报错
  • 补充了youtube_dl的基础下载逻辑,可根据需求调整音质、保存路径等参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12