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

KIVY:点击MDCard跳转SecondWindow并展示对应选中地点全量数据的问题

问题原因

  • 你当前为每个MDCard添加了3个MDLabel,所以FirstWindow会显示全部信息,不符合只显示地点名称的需求
  • 你将选中的数据存储在FirstWindow.clicked函数对象的属性上,函数作为类的公共属性会被所有实例共享,循环绑定时每次赋值都会覆盖上一次的值,导致最终只会保留最后一组卡片数据
  • 点击事件中self.create_scrollview是无效语句,无实际作用

修正代码

*.py

import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.properties import StringProperty
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.core.window import Window
from kivymd.app import MDApp
from kivymd.uix.card import MDCard
from kivymd.uix.label import MDLabel
from kivymd.uix.separator import MDSeparator # 补充分隔符导入,避免KV文件报错


class FirstWindow(Screen):
    # 用实例属性存储选中的数据,避免共享覆盖
    selected_place_name = StringProperty("")
    selected_place_address = StringProperty("")
    selected_place_postcode = StringProperty("")

    def __init__(self, **kwargs):
        super(FirstWindow, self).__init__(**kwargs)
        Clock.schedule_once(self.create_scrollview)

    def create_scrollview(self, dt):
        layout = BoxLayout( orientation='vertical', spacing=25, size_hint_y=None, size_hint=(1, None) ,padding=[170, 10])
        layout.bind(minimum_height=layout.setter("height"))
        testz = [["A","AA","AAA"],["B","BB","BBB"],["C","CC","CCC"]]
        for x in testz:
            name = x[0]
            address = x[1]
            street = x[2]
            card = MDCard(orientation='vertical', size_hint=(1, None), height=200 ,padding=(20,0),ripple_behavior= True,radius=[5, ], elevation = 18)
            # 仅添加名称标签,符合FirstWindow只显示地点名称的需求
            card.add_widget(MDLabel(text=name, halign= "center"))
            # 将完整地点数据存入当前卡片的自定义属性,点击时直接读取
            card.place_data = {"name": name, "address": address, "postcode": street}
            layout.add_widget(card)
            card.bind(on_touch_down=self.clicked) 

        scrollview = ScrollView(size_hint=(1, 1))
        self.view.add_widget(scrollview)
        scrollview.add_widget(layout)
        self.ids.house.text = "MAP"
    
    def clicked(self, card, touch):
        if card.collide_point(*touch.pos):
            # 读取当前点击卡片的存储数据
            self.selected_place_name = card.place_data["name"]
            self.selected_place_address = card.place_data["address"]
            self.selected_place_postcode = card.place_data["postcode"]
            self.manager.current = 'SecondWindow'
            
class SecondWindow(Screen):
    def on_pre_enter(self):
        # 从ScreenManager获取FirstWindow实例,读取选中的地点数据
        first_window = self.manager.get_screen("FirstWindow")
        self.ids.place_name.text = first_window.selected_place_name
        self.ids.place_address.text = first_window.selected_place_address
        self.ids.place_postcode.text = first_window.selected_place_postcode
    
    def test(self):
        self.manager.transition.direction = "right"
        self.manager.current = 'FirstWindow'

class ScreenSwitcher(ScreenManager):
    pass

class MainScreen(GridLayout):
    pass

class NearMeApp(MDApp):
    def build(self):
        self.theme_cls.theme_style ="Dark"
        self.theme_cls.accent_palette = "Red"
        self.theme_cls.primary_palette = "Blue"
        return MainScreen()

if __name__ == '__main__':
    NearMeApp().run()

*.kv

你原有KV代码无需修改,可直接使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:15:05