使用Kivy中的RecycleView定制小部件的对齐问题

时间:2018-02-23 15:17:39

标签: python python-3.x user-interface kivy kivy-language

所以我有这个聊天应用程序,就像我使用Kivy的 RecycleView来实例化一个自定义小部件(命名为' Row')并且我传递了它的值我希望。

如果Row自定义小部件仅包含Label子级,我添加图像和按钮的时刻(我将在一秒内解释原因),存在奇怪的间距和定位问题,它可以正常工作/ strong>哪个不应该存在,因为我正在使用BoxLayout并尝试了正确的size_hint:和height:技术让它们看起来正确。

相关的KV代码:

<Row@BoxLayout>:
    orientation: 'vertical'
    text: ''
    source: 'res/icon.png'
    buttontext: ''
    Label:
        markup: True
        text_size: self.size
        text: root.text
    Image:
        size: self.size
        source: root.source
        allow_stretch: True
    Button:
        text: root.buttontext #contains a link
        on_press: app.root.stuff(self.text) #opens that link

# Relevant Screen where I am using the RecycleView
<ChatBotScreen>
    BoxLayout:
        ti_userinput: ti_userinput
        orientation: 'vertical'
        ScrollView:
            size_hint_y: 85
            RecycleView:
                id: chatbase_list
                viewclass: 'Row'
                data: []
                RecycleBoxLayout:
                    padding: "15dp", "45dp", "15dp", "15dp"
                    default_size: None, dp(25)
                    default_size_hint: 1, None
                    size_hint_y: None
                    height: self.minimum_height
                    orientation: 'vertical'

        TextInput:
            size_hint_y: None
            height: "40dp"
            id: ti_userinput
            multiline: False
            on_text_validate: root.on_user_enter_text()

由于我的自定义窗口小部件Row正在扩展BoxLayout并且我使用垂直方向,为什么子窗口小部件(标签,图像和按钮)不重叠?

这是班级&amp;我正在调用的函数来传递RecycleView

中的数据
    class ChatBotScreen(Screen):
        nickname = StringProperty()
        rvList = []

        def display_bot_output(self, botOutput):
            # Initialize an empty dictionary
            tempDict = {}
            textToDisplay = '' + botOutput

            # Update the dictionary with properties:values and then pass it as a list to RecycleView's data
            tempDict.update({'text':textToDisplay, 'buttontext':'https://google.com'})
            self.rvList.append(tempDict)
            self.ids.chatbase_list.data = self.rvList

我想在屏幕上看到的是:

  • 我通过标签 textToDisplay 变量发送的文字

  • 在标签下方,如果没有通过来源,则不会显示图像,我可以显示图片来源,

  • 在图像下方,应显示带有链接的按钮,我通过 buttontext ,如果没有通过,则不会显示任何按钮。

我能够渲染所有这些但是间距全部都搞砸了。

下面的截图:

这里我首先发送的数据只有Label文本信息和Image,因此Button文本为空(它仍然显示),然后我发送另一个数据(第二行小部件),带有Label文本信息,Image和Button文字(谷歌链接)。

all comes on top of each other

任何帮助非常赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

<ChatBotScreen>
    BoxLayout:
       ti_userinput: ti_userinput
       orientation: 'vertical'
       ScrollView:
       # to have the screen get bigger not lliek what you have
           size: root.size
           RecycleView:
               id: chatbase_list
               viewclass: 'Row'
               data: []
               RecycleBoxLayout:
                    padding: "15dp", "45dp", "15dp", "15dp"
                    default_size: None, dp(25)
                    default_size_hint: 1, None
                    size_hint_y: None
                    height: self.minimum_height
                    # add this so you can scroll
                    row_default_height: 60
                    orientation: 'vertical'

    TextInput:
        size_hint_y: None
        height: "40dp"
        id: ti_userinput
        multiline: False
        on_text_validate: root.on_user_enter_text()