如何在KivyMD动态好友列表中获取点击项的好友名称?
问题解决:获取好友列表项的名称并传递到对话框
你的核心问题是点击邮件图标时,无法正确获取对应列表项的好友名称——当前代码传递的是按钮自身的text属性(未设置,所以为空),而非MDListItemHeadlineText里的好友名称。以下是两种直接可行的解决方案:
方案1:直接绑定好友名称(最简洁)
在循环创建列表项时,利用lambda的默认参数绑定当前循环的好友名称,避免循环变量引用问题:
修改FriendsList类的on_enter方法中按钮的创建代码:
TrailingPressedIconButton( icon="email", # 用默认参数绑定当前row的好友名称,确保每个按钮对应正确的名称 on_release=lambda x, friend_name=row[0]: self.message_dialog_open(friend_name) )
这样点击按钮时,会直接把对应的好友名称传递给message_dialog_open方法,无需额外查找控件。
方案2:通过控件层级获取名称
如果不想直接传递名称,可以通过按钮的父控件MDListItem,遍历子控件找到MDListItemHeadlineText并获取文本:
第一步:修改按钮的点击事件传递按钮实例
TrailingPressedIconButton( icon="email", on_release=lambda x: self.message_dialog_open(x) )
第二步:修改message_dialog_open方法获取名称
def message_dialog_open(self, button): # 获取按钮所在的MDListItem父控件 list_item = button.parent # 遍历子控件找到MDListItemHeadlineText friend_name = "Unknown" for child in list_item.children: if isinstance(child, MDListItemHeadlineText): friend_name = child.text break self.message_input_field = MDTextField(mode="filled", height="100dp", multiline=True) self.message_dialog = MDDialog( MDDialogHeadlineText(text=f'Message {friend_name}'), MDDialogContentContainer(self.message_input_field), MDDialogButtonContainer( Widget(), MDButton( MDButtonText(text="Cancel"), style="text", on_release=lambda *args: self.message_dialog.dismiss() ), MDButton( MDButtonText(text="Send"), style="text", on_release=lambda *args: self.message_send_button_click() ), spacing="8dp", ), ) self.message_dialog.open()
额外修正:修复Test类的继承错误
你的Test类同时继承MDApp和MDScreen是错误的,App类只需继承MDApp:
class Test(MDApp): def build(self): return Builder.load_string(KV)
内容的提问来源于stack exchange,提问作者Максим Игрок
相关产品推荐
相关产品推荐

