Как добавить виджеты на ярлык в scrollview Kivy - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать страницу чата, которая выглядит как стандартное приложение для обмена сообщениями на телефоне (Whatsapp, Imessage et c). Для этого я создал экран, содержащий ScrollView, и добавил к нему виджет метки.

Чтобы получить желаемый эффект от вида Whatsapp / Imessage, я думаю, что затем я хочу добавить виджет ярлыка к ярлыку в ScrollView при каждом нажатии кнопки отправки, после чего будет добавлен текст текста. поле ввода на экран.

Можно ли добавить метку к другой метке? Каждый вопрос, который я рассмотрел до сих пор, касался добавления виджета в BoxLayout или GridLayout.

Я также не уверен, как я получу положение метки для изменения каждый раз, когда кнопка нажата только один шаг за раз!

kv файл:

WindowManager:
    ChatPage:

<ChatPage>:
    name: "chat_page"
    layout_content: layout_content

    NavigationLayout:
        id: nav_layout
        MDNavigationDrawer:
            NavigationDrawerIconButton:
                text: "Test"

        FloatLayout:
            MDToolbar:
                pos_hint: {'top': 1}
                md_bg_color: 0.2, 0.6, 1, 1

            ScrollView:
                size_hint: 1, 0.6
                pos_hint: {"top" : 0.8, "bottom" : 0.5}
                GridLayout:
                    id: layout_content
                    cols: 1
                    size_hint_y: None
                    height: self.minimum_height
                    canvas:
                        Color:
                            rgba: (1, 1, 1, 1)
                        Rectangle:
                            size: self.size
                            pos: self.pos

                    Label:
                        text_size: self.width - 20, None
                        size_hint_y: None
                        height: self.texture_size[1]
                        color: 0,0,0,1

            BoxLayout:
                TextInput:
                    id: msg
                    hint_text: "Type your message here"
                    pos_hint: {"x": 0, "top": 0.15}
                    size_hint: 0.75, 0.15
                Button:
                    text: "Send"
                    background_normal: ""
                    background_color: 0, 0.6, 0, 1
                    pos_hint: {"x": 0.75, "top": 0.15}
                    size_hint: 0.25, 0.15
                    on_release: root.btn_press()

<SmoothLabel@Label>:
    background_color: 0,0,0,0
    background_normal: ""
    back_color: 1,0,1,1
    border_radius: [6]
    canvas.before:
        Color:
            rgba: 0.2,0.6,1,1 #This changes the label colour
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: self.border_radius

py файл:

import kivy
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty, NumericProperty, ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivymd.theming import ThemeManager
from kivy.uix.scrollview import ScrollView

Window.clearcolor = (1,1,1,1)

class SmoothLabel(Label):
    pass

class WindowManager(ScreenManager):
    pass

class ChatPage(Screen):
    layout_content = ObjectProperty(None)
    def btn_press(self):
        if self.ids.msg.text:
            self.layout_content.add_widget(SmoothLabel(text=self.ids.msg.text, size_hint_x=0.5, size_hint_y=0.1, pos_hint={"x": 0.1, "top": 0.8}, background_color=(0.2, 0.6, 1, 1)))
            self.ids.msg.text = ""
        else:
            pass

class MyApp(App):
    theme_cls = ThemeManager()

    def build(self):
        kv = Builder.load_file("kivy.kv")
        sm = WindowManager()

        screens = [ChatPage(name="chat_page")]
        for screen in screens:
            sm.add_widget(screen)

        sm.current = "chat_page"
        return sm


if __name__ == '__main__':
    MyApp().run()

Спасибо

1 Ответ

0 голосов
/ 08 января 2020

Внесены некоторые изменения в ваш код (в дополнение к удалению всех kivyMD), чтобы он заработал:

Сначала я изменил правило SmoothLabel в вашем kv на:

<SmoothLabel>:
    size_hint: None, None
    size: self.texture_size
    background_color: 0,0,0,0
    background_normal: ""
    back_color: 1,0,1,1
    border_radius: [6]
    canvas.before:
        Color:
            rgba: 0.2,0.6,1,1 #This changes the label colour
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: self.border_radius

Взял @Label, поскольку он уже указан в вашем коде python, и добавил size_hint и size (в противном случае GridLayout решает размер SmoothLabel children).

Кроме того, удалено

background_color=(0.2, 0.6, 1, 1)

из создания SmoothLabel (которое вызывало для меня исключение), поэтому определение ChatPage теперь выглядит следующим образом:

class ChatPage(Screen):
    layout_content = ObjectProperty(None)
    def btn_press(self):
        if self.ids.msg.text:
            self.layout_content.add_widget(SmoothLabel(text=self.ids.msg.text))
            self.ids.msg.text = ""
        else:
            pass

Виджет Label не имеет атрибута background_color. И, поскольку я добавил size_hint к правилу, я удалил его из вызова SmoothLabel(). Кроме того, GridLayout не поддерживает pos_hint.

Этого было достаточно, чтобы заставить код работать на меня.

...