从 KivyMD 中的动态列表中获取文本

问题描述 投票:0回答:1

我有一个实现好友列表的代码。当您单击消息图标时,会出现一个弹出窗口,其中包含消息发送者的标题。我需要从用户单击此图标的 MDListItemHeadlineText 获取朋友的姓名。 我的 kv 代码在这里:

from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.uix.widget import Widget
from kivymd.app import MDApp
from kivymd.uix.button import MDButton, MDButtonText
from kivymd.uix.dialog import MDDialog, MDDialogHeadlineText, MDDialogButtonContainer, MDDialogContentContainer
from kivymd.uix.screen import MDScreen
from kivymd.uix.textfield import MDTextField
from kivymd.uix.list import (MDListItem, MDListItemHeadlineText, MDListItemSupportingText,
                             MDListItemTertiaryText, MDListItemTrailingIcon)
from kivymd.uix.behaviors import RotateBehavior
from kivy.uix.behaviors import ButtonBehavior

KV = '''
ScreenManager:
    Main:
    FriendsList:
        id: friends_list
        name: 'friends_list'

<Main>
    BoxLayout:
        orientation: 'vertical'
        spacing: 10
        Button:
            text: 'Friends'
            on_press: root.list_click()                
    
    
<FriendsList>
    BoxLayout:
        orientation: 'vertical'
        spacing: 10
        canvas:
            Color:
                rgba: 255/255, 255/255, 255/255, 1
            Rectangle:
                source: "./Images/main_background.jpg"
                size: self.size
                pos: self.pos
        MDScrollView:
            id:scroll
    
            MDList:
                id: lists
'''

和我的 py 文件示例:

class TrailingPressedIconButton(ButtonBehavior, RotateBehavior, MDListItemTrailingIcon):
    ...


class FriendsList(Screen):

    def on_enter(self):
        file_reader = [['name_1', 'text_1', 'text_text_1'],
                       ['name_2', 'text_2', 'text_text_2'],
                       ['name_3', 'text_3', 'text_text_3']]
        for row in file_reader:
            self.ids.lists.add_widget(MDListItem(
                MDListItemHeadlineText(text=row[0], theme_text_color='Custom', text_color='black'),
                MDListItemSupportingText(text=row[1], theme_text_color='Custom', text_color='grey'),
                MDListItemTertiaryText(text=row[2], theme_text_color='Custom', text_color='black'),
                TrailingPressedIconButton(icon="email", on_release=lambda x: self.message_dialog_open(x.text))
            )
            )

    def message_dialog_open(self, friend_name):
        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()


class Main(Screen):

    def list_click(self):
        self.manager.current = 'friends_list'
        self.manager.transition.direction = 'left'


class Test(MDApp, MDScreen):

    def build(self):
        return Builder.load_string(KV)

Kivy版本:2.0.1dev0

Python:3.10

我尝试将 MDListItemHeadlineText 包装为对象,但它也不起作用。

我很高兴收到这方面的每一个答案和帮助

python-3.x kivy kivy-language kivymd
1个回答
0
投票

尝试更改线路:

TrailingPressedIconButton(icon="email", on_release=lambda x: self.message_dialog_open(x.text))

至:

TrailingPressedIconButton(icon="email", on_release=lambda button, friend=row[0]: self.message_dialog_open(button, friend))

这会将朋友的名字传递给您的

message_dialog_open()
方法。这需要对该方法进行一些小的更改:

def message_dialog_open(self, friend_name):

至:

def message_dialog_open(self, button, friend_name):

现在您的

message_dialog_open()
方法将收到好友姓名。

© www.soinside.com 2019 - 2024. All rights reserved.