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

Kivy中获取RecyclerView内AsyncImage的Source并跨屏显示问题

解决Kivy RecycleView中AsyncImage的source传递到UserInfo屏幕的问题

核心修改思路

  1. 在App类中添加全局属性存储选中的图片source
  2. 点击按钮时将当前AsyncImage的source赋值给该属性
  3. 在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

修改说明

  1. 全局属性selected_image_source:作为不同屏幕间的数据桥梁,专门存储选中的图片source
  2. 按钮事件调整:先完成数据存储再切换屏幕,避免因屏幕切换导致数据未同步
  3. UserInfo屏幕显示:通过on_enter事件读取全局属性并更新标签,或者直接绑定标签的text属性到app.selected_image_source,两种方式都能实现需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:55:21