Python 在ListView中作为元素的自定义小部件

Python 在ListView中作为元素的自定义小部件,python,kivy,Python,Kivy,我只想写一个聊天室应用程序,并想实现ListView中的消息列表so-message概念 但是我不知道怎么做,因为kivy上的列表适配器只能接受列表中的ListItemButton或ListItemLabel元素。他不接受我的自定义类的类型,甚至不接受简单的BoxLayout。提前谢谢你。我建议你使用QtWebKit for your聊天程序,因为在聊天中使用HTML标记非常理想-它为你提供了无限的聊天信息 您可以使用标签嵌入图像,将文本设置为粗体或斜体 您可以使用标签嵌入youtube(和其

我只想写一个聊天室应用程序,并想实现ListView中的消息列表so-message概念


但是我不知道怎么做,因为kivy上的列表适配器只能接受列表中的ListItemButton或ListItemLabel元素。他不接受我的自定义类的类型,甚至不接受简单的BoxLayout。提前谢谢你。

我建议你使用QtWebKit for your聊天程序,因为在聊天中使用HTML标记非常理想-它为你提供了无限的聊天信息

您可以使用标签嵌入图像,将文本设置为粗体或斜体

您可以使用标签嵌入youtube(和其他)视频

您所需要的是:

  • 创建QtWebKit的实例

  • 在它的内部,放置带有JavaScript函数的简单html文件,该文件将处理一些外部信号,获取入站数据并将其放入html

  • 在外部,消息到达后,将其包装成HTML,并传递给QtWebKit

  • 你可以用它

    RecycleView为查看大型数据集的选定部分提供了灵活的模型。它旨在防止在生成大量小部件以显示许多数据项时可能出现的性能下降

    它使用

    …命令根据需要生成viewclass的实例


    通过
    viewclass
    它意味着您的自定义列表项小部件。

    首先,您不再使用ListView,因为它已被弃用,kivy建议使用RecycleView,其概念类似于ListView,有一个数据字段是字典列表,其中,字典是使用视图的小部件为创建每个项目而接收的属性

    假设自定义小部件已经有了它,那么您必须公开列表可以修改的所有属性,在示例中有3个属性:source_image、title和message

    from kivy.app import App
    from kivy.base import runTouchApp
    
    from kivy.lang import Builder
    from kivy.uix.recycleview import RecycleView
    
    Builder.load_string('''
    
    <CustomWidget@BoxLayout>:
    
        source_image: ""
        title: ""
        message: ""
    
        orientation: 'horizontal'
        Image:
            source: root.source_image
            size_hint_x: 1
        BoxLayout:
            size_hint_x: 2
            orientation: 'vertical'
            Label:
                text: root.title
                size: self.texture_size
                size_hint_y: None
            Label:
                text: root.message
    
    <View>:
        viewclass: 'CustomWidget'
        RecycleBoxLayout:
            default_size: None, dp(56)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'
    ''')
    
    class View(RecycleView):
        def __init__(self, **kwargs):
            super(View, self).__init__(**kwargs)
            self.data = [{'source_image': "heart.png", 'title': "title{}".format(i), 'message': "message"} for i in range(100)]
    
    if __name__ == '__main__':
        runTouchApp(View())
    
    从kivy.app导入应用
    从kivy.base导入runTouchApp
    从kivy.lang导入生成器
    从kivy.uix.recycleview导入recycleview
    Builder.load_字符串(“”)
    :
    源图像:“
    标题:“
    信息:“
    方向:“水平”
    图片:
    来源:root.source\u图像
    大小提示:1
    盒子布局:
    尺寸提示:2
    方向:“垂直”
    标签:
    文本:root.title
    大小:self.texture\u大小
    尺寸提示:无
    标签:
    文本:root.message
    :
    viewclass:'CustomWidget'
    循环利用布局:
    默认大小:无,dp(56)
    默认大小提示:1,无
    尺寸提示:无
    高度:自身最小高度
    方向:“垂直”
    ''')
    类视图(RecycleView):
    定义初始(自我,**kwargs):
    超级(视图,自我)。\uuuuu初始化(**kwargs)
    self.data=[{'source_image':“heart.png”,“title':“title{}”.format(i),'message':“message”}表示范围(100)内的i)
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    runTouchApp(视图())
    
    谢谢你的回答,但我需要了解Kivy。