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

