Kivy中获取RecyclerView内AsyncImage的Source并跨屏显示问题
解决Kivy RecycleView中AsyncImage的source传递到UserInfo屏幕的问题
核心修改思路
- 在App类中添加全局属性存储选中的图片source
- 点击按钮时将当前AsyncImage的source赋值给该属性
- 在UserInfo屏幕中读取属性并显示对应内容
修改后的Python代码
from kivy.app import App from kivy.properties import ListProperty, StringProperty from kivymd.app import MDApp from kivy.uix.screenmanager import ScreenManager from kivy.lang import Builder import requests class ReviewinApp(MDApp): new_dialog = None notdialog = None dialog = None dialoge = None asyncimage = None doc = None data = ListProperty() id_ = ListProperty() # 添加全局属性存储选中的图片source selected_image_source = StringProperty('') def build(self): self.title = "ReviewinApp" sm = ScreenManager() sm.add_widget(Builder.load_file("splash.kv")) sm.add_widget(Builder.load_file("accueil.kv")) sm.add_widget(Builder.load_file('conditions.kv')) sm.add_widget(Builder.load_file("register.kv")) sm.add_widget(Builder.load_file("faq.kv")) sm.add_widget(Builder.load_file("login.kv")) sm.add_widget(Builder.load_file("User2.kv")) sm.add_widget(Builder.load_file("rules.kv")) sm.add_widget(Builder.load_file("commentinput.kv")) sm.add_widget(Builder.load_file("UserInfo.kv")) sm.add_widget(Builder.load_file('test.kv')) return sm def load_products(self): token = self.token # 确保token已完成初始化 json_data = {"token": token} res = requests.post('http://127.0.0.1:2223/products/list', json=json_data) self.doc = res.json() self.data = [ {'source': f'http://127.0.0.1:2223/products/{str(item.replace(".png", ""))}'} for item in self.doc ] def en(self): # 调试用打印,可根据需求保留或删除 print(self.selected_image_source)
修改后的KV代码
test.kv部分
MDScreen: name: 'test' md_bg_color: 41/255, 34/255, 34/255, 1 on_enter: app.load_products() RecycleView: viewclass: "OwnWidget" data: app.data RecycleBoxLayout: default_size: None, dp(300) default_size_hint: 1, None size_hint_y: None height: self.minimum_height orientation: 'vertical' spacing: dp(20) <OwnWidget@BoxLayout>: orientation: 'vertical' source:'' MDIconButton: icon: 'arrow-left' icon_color: 'white' theme_icon_color: 'Custom' pos_hint: {'center_x':0.3, 'center_y': 0.1} size_hint_x: 0.3 height: dp(40) on_press: # 先保存当前图片的source到全局属性 app.selected_image_source = product.source # 再切换到UserInfo屏幕 app.root.current = "UserInfo" AsyncImage: id: product source: root.source
UserInfo.kv部分
MDScreen: name: "UserInfo" on_enter: app.en() # 将全局属性中的source赋值给标签 test_text.text = app.selected_image_source MDFloatLayout: md_bg_color: 41/255, 34/255, 34/255, 1 MDLabel: id: test_text text: "" color: 1,1,1,1 # 确保文字在深色背景下可见 # 也可以直接绑定属性,无需on_enter事件:text: app.selected_image_source
修改说明
- 全局属性
selected_image_source:作为不同屏幕间的数据桥梁,专门存储选中的图片source - 按钮事件调整:先完成数据存储再切换屏幕,避免因屏幕切换导致数据未同步
- UserInfo屏幕显示:通过
on_enter事件读取全局属性并更新标签,或者直接绑定标签的text属性到app.selected_image_source,两种方式都能实现需求
内容的提问来源于stack exchange,提问作者user18862346
相关产品推荐
相关产品推荐

