Python 滚动视图不显示图像

Python 滚动视图不显示图像,python,Python,我正在尝试制作一个类似聊天的小部件,它可以同时显示文本和图像。我希望能够动态地添加数据,因为数据会随着时间的推移而进入。我决定使用滚动视图,使用网格布局,并添加标签和图像的实例。问题是,图像不会被渲染。我认为这可能是由于它们的大小,但我不太确定是否是这样,如果是这样,如何修复它 从kivy.app导入应用 从kivy.lang导入生成器 从kivy.uix.scrollview导入scrollview 从kivy.uix.label导入标签 从kivy.uix.image导入图像 Builder

我正在尝试制作一个类似聊天的小部件,它可以同时显示文本和图像。我希望能够动态地添加数据,因为数据会随着时间的推移而进入。我决定使用滚动视图,使用网格布局,并添加标签和图像的实例。问题是,图像不会被渲染。我认为这可能是由于它们的大小,但我不太确定是否是这样,如果是这样,如何修复它

从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.scrollview导入scrollview
从kivy.uix.label导入标签
从kivy.uix.image导入图像
Builder.load_字符串(“”)
:
是否滚动\u x:False
网格布局:
id:布局
科尔斯:1
间距:10
尺寸提示:无
''')
SV类(滚动视图):
定义初始(自我,**kwargs):
超级(SV,自我)。\uuuuu初始值(**kwargs)
对于范围(30)内的i:
如果i%3==0:self.add_iamge('1.jpg'))
其他:self.add_标签(str(i))
def添加_标签(自身,文本):
self.ids.layout.add_小部件(标签(text=text))
def添加尺寸(自,src):
self.ids.layout.add_小部件(Image(source=src))
类TestApp(应用程序):
def生成(自):
返回SV()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
这就是它所呈现的

问题标签的高度 如何确定标签需要的最小高度,以便 渲染正确吗

解决方案 使用以下任一选项:

代码片段-kv文件 解决方案-滚动视图不显示图像 需要以下增强功能

  • 设置
    滚动视图的大小,例如
    大小\u提示:1,无
    大小:(Window.width,Window.height)

  • 确保
    高度
    可以滚动,例如
    高度:self.最小高度

  • 添加小部件时,需要提供小部件的
    size
    ,例如
    size\u hint\u y=None,height=40
实例 main.py
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.scrollview导入scrollview
从kivy.uix.label导入标签
从kivy.uix.image导入图像
Builder.load_字符串(“”)
#:导入窗口kivy.core.Window.Window
:
是否滚动\u x:False
大小提示:1,无
尺寸:(窗宽、窗高)
网格布局:
id:布局
科尔斯:1
间距:10
尺寸提示:无
高度:自身最小高度
''')
SV类(滚动视图):
定义初始(自我,**kwargs):
超级(SV,自我)。\uuuuu初始值(**kwargs)
对于范围(30)内的i:
如果i%3==0:
self.add_iamge('raspberrypi.png'))
其他:
自我添加标签(str(i))
def添加_标签(自身,文本):
self.ids.layout.add_小部件(标签(text=text,size\u-hint\u-y=None,height=40))
def添加尺寸(自,src):
self.ids.layout.add_小部件(图像(source=src,size\u hint\u y=None,height=40))
类TestApp(应用程序):
def生成(自):
返回SV()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
输出

谢谢,这似乎正好解决了问题。只有一件事,我想让图像和标签有不同的高度。我想我可以通过使用比率来管理图像,设置最小和最大高度,并根据比率进行插值以获得最大高度,但是当涉及到标签时,我如何确定标签需要的最小高度以正确渲染?谢谢
# Label’s size will be set to the text content (plus padding):
<Label>:
    size: self.texture_size
# Label that can grow vertically but wraps the text at a certain width
<Label>:
    text_size: root.width, None
    size: self.texture_size
def add_label(self, text):
    self.ids.layout.add_widget(Label(text=text))
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView
from kivy.uix.label import Label
from kivy.uix.image import Image

Builder.load_string('''
#:import Window kivy.core.window.Window

<SV>:
    do_scroll_x: False
    size_hint: 1, None
    size: (Window.width, Window.height)

    GridLayout:
        id: layout
        cols: 1
        spacing: 10
        size_hint_y: None
        height: self.minimum_height

''')


class SV(ScrollView):
    def __init__(self, **kwargs):
        super(SV, self).__init__(**kwargs)
        for i in range(30):
            if i % 3 == 0:
                self.add_iamge('raspberrypi.png')
            else:
                self.add_label(str(i))

    def add_label(self, text):
        self.ids.layout.add_widget(Label(text=text, size_hint_y=None, height=40))

    def add_iamge(self, src):
        self.ids.layout.add_widget(Image(source=src, size_hint_y=None, height=40))


class TestApp(App):
    def build(self):
        return SV()


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