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
相关产品推荐
相关产品推荐

