#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
.