Холст не выравнивается правильно

#python #kivy #kivymd

#python #kivy #kivymd

Вопрос:

я пытаюсь создать приложение для чата, используя kivy и kivymd, но я столкнулся с проблемой. Я пытаюсь разместить холст перед виджетом метки, но он не выравнивается правильно. Пожалуйста, помогите мне исправить эту проблему.

Код Kivy

 <ChatScreen>:
    GridLayout:
        cols: 1
        MDToolbar:
            title: 'My Room'
            anchor_title: 'center'
            left_action_items: [['menu', lambda x: x]]
            right_action_items: [['logout-variant', lambda x:x]]
        ScrollView:
            BoxLayout:
                id: chat_area
                orientation: 'vertical'
                size_hint: 1, 1
                canvas.before:
                    Color:
                        rgba: 0,0,0,0.2
                    Rectangle:
                        pos: self.pos
                        size: self.size
        Widget:
            id: separator
            size_hint: 1, 0.008
            pos_hint: {'center_x':0.5, 'center_y':0.5}
            canvas:
                Color:
                    rgba: 0,0,0,1
                Rectangle:
                    pos: 0, separator.center_y
                    size: separator.width, 1.5
        GridLayout:
            cols: 2
            size_hint: 1, 0.1
            TextInput:
                id: msg
                hint_text: 'Enter Message'
                background_color: 0,0,0,0  
                foreground_color: 0,0,0,1
            MDIconButton:
                icon: 'send'
                on_press: root.send_msg()
 

Код Python

 class ChatScreen(Screen):
    def send_msg(self):
        msg = self.ids.msg.text
        if msg=='':
            pass
        else:
            label = MDLabel(
                text=msg,
                size_hint=(0.3, 1),
                pos_hint={'center_x': 0.7, 'center_y': 0.5}
                )
            with label.canvas.before:
                Color(0,1,0,0.7)
                RoundedRectangle(radius=[30,30,30,30], size=label.size, pos=label.pos)
            self.ids.chat_area.add_widget(label)
            self.ids.msg.text = ''
 

Холст метки, который добавляется при нажатии кнопки, накладывается друг на друга. Пожалуйста, помогите.

Ответ №1:

Причина, по которой вы RoundedRectangle находитесь в неправильном положении, заключается в том, что позиция и размер устанавливаются при создании MDLabel , поэтому он использует значения по умолчанию (0,0) и (100,100) .

Вы можете воспользоваться автоматическими привязками, которые предоставляет вам kivy, определив класс для сообщений. Возможно, так:

 class ChatMessage(MDLabel):
    pass
 

Затем добавьте правило для этого класса в kv :

 <ChatMessage>:
    size_hint: (0.3, 1)
    pos_hint: {'center_x': 0.7, 'center_y': 0.5}
    canvas.before:
        Color:
            rgba: (0,1,0,0.7)
        RoundedRectangle:
            radius: [30,30,30,30]
            pos: self.pos
            size: self.size
 

И используйте новый класс в своем send_msg() методе:

 class ChatScreen(Screen):
    def send_msg(self):
        msg = self.ids.msg.text
        if msg=='':
            pass
        else:
            label = ChatMessage(text=msg)
            self.ids.chat_area.add_widget(label)
            self.ids.msg.text = ''
 

Теперь RoundedRectangle размер и положение автоматически будут скорректированы в соответствии с размером и положением ChatMessage .