У меня есть код, реализующий список друзей. Когда вы щелкнете значок сообщения, появится всплывающее окно с заголовком того, кому оно отправлено. Мне нужно получить имя друга из 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)
Версия Киви: 2.0.1dev0
Питон: 3.10
Я попытался обернуть MDListItemHeadlineText как объект, но это тоже не сработало.
Буду рад получить каждый ответ и помощь в этом
Попробуйте изменить строку:
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()
получит имя друга.