Python Kivy-使用自定义行布局滚动项目列表

Python Kivy-使用自定义行布局滚动项目列表,python,kivy,Python,Kivy,我需要在kivy中创建具有自定义行布局的项目列表。 每行应有:标签(带文字环绕),和两个小图像(并排),图像下方按比例缩放至全宽(高度成比例)。 我该怎么做?我已经试过了(代码!): 但无法将图像“las.jpg”缩放到全宽 我尝试以其他方式(代码2)执行此操作: 从kivy.app导入应用 从kivy.lang导入生成器 从kivy.uix.floatlayout导入floatlayout 从kivy.app导入应用程序 从kivy.lang导入生成器 从kivy.uix.floatlayou

我需要在kivy中创建具有自定义行布局的项目列表。 每行应有:标签(带文字环绕),和两个小图像(并排),图像下方按比例缩放至全宽(高度成比例)。 我该怎么做?我已经试过了(代码!):

但无法将图像“las.jpg”缩放到全宽

我尝试以其他方式(代码2)执行此操作:

从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.floatlayout导入floatlayout
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.floatlayout导入floatlayout
生成器。加载\u字符串(“”)
:
滚动视图:
网格布局:
科尔斯:1
盒子布局:
方向:“垂直”
填充:10
盒子布局:
方向:“水平”
按钮:
案文:“1”
盒子布局:
方向:“水平”
按钮:
案文:“2”
按钮:
案文:“3”
按钮:
案文:“4”
盒子布局:
方向:“水平”
按钮:
案文:“5”
按钮:
案文:“6”
盒子布局:
方向:“水平”
按钮:
案文:“7”
按钮:
案文:“8”
按钮:
案文:“9”
按钮:
案文:“10”
盒子布局:
方向:“水平”
按钮:
案文:“7”
按钮:
案文:“8”
按钮:
案文:“9”
按钮:
案文:“10”
盒子布局:
方向:“水平”
按钮:
案文:“7”
按钮:
案文:“8”
按钮:
案文:“9”
按钮:
案文:“10”
""")
类框(浮动布局):
通过
类TestApp(应用程序):
def生成(自):
返回框()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
在这种情况下,行中的列数可以不同,但滚动 不工作(所有小部件都适合屏幕,但我需要滚动)

//编辑 我尝试了代码(方法如代码2中所示):

导入kivy
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.floatlayout导入floatlayout
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.label导入标签
从kivy.uix.image导入图像
从os.path导入联接
从kivy.uix.gridlayout导入gridlayout
生成器。加载\u字符串(“”)
:
滚动视图:
网格布局:
科尔斯:1
id:gridlayout
盒子布局:
方向:“垂直”
id:verticalbox
""")
类框(浮动布局):
通过
类TestApp(应用程序):
def生成(自):
widgets=box()
verticalbox=widgets.ids[“verticalbox”]
重复=10次
widgets.ids[“gridlayout”].size\u hint\u y=重复
对于范围内的(0,重复):
布局1=框布局(方向=水平)
filename=join(kivy.kivy\u data\u dir,'logo','kivy-icon-256.png')
l1=图像(源=文件名,大小_-hint _-y=None)#,位置=(0,-200*i),大小=(50,50))
l3=图像(源=文件名,大小_hint_y=None)#,位置=(100,-200*i),大小=(50,50))
btn1=标签(text=“aaaa”,size\u hint\u y=None)
btn2=标签(text=“aaaa”,size\u hint\u y=None)
btn3=标签(text=“aaaa”,size\u hint\u y=None)
布局1.添加小部件(btn1)
布局1.添加小部件(btn2)
布局1.添加小部件(btn3)
布局2=框布局(方向=水平)
btn4=标签(text=“avvvvvaaaaaaaaaaaaaaagggggggggggggggggggggggzzzzzzzzzzzaaaaaaaaaaaaaaaaaaaaaaaaaaaa”,大小提示\u y=无)
布局2.添加小部件(btn4)
布局3=框布局(方向=水平)
l2=图像(source=“jezioro.jpg”)
布局3.添加小部件(l2)
verticalbox.add_小部件(布局1)
verticalbox.add_小部件(布局2)
verticalbox.add_小部件(布局3)
返回小部件
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
滚动可以工作,但图像l2不能缩放到屏幕宽度,它可以缩放到 btn2宽度。但是,在另一行中,btn4的缩放是正确的!为什么?


有什么想法吗?

当你说“所有小部件都适合屏幕”时,你的意思是它们的高度都被压扁了吗?如果是这样,如果设置小部件的高度,使GridLayout的最小高度大于屏幕高度,会发生什么情况?谢谢,现在滚动可以工作,但图像缩放仍然存在问题:-(当您说“所有小部件都适合屏幕”时)你的意思是它们的高度被压扁了吗?如果是的话,如果你设置小部件的高度,使GridLayout的最小高度大于屏幕高度,会发生什么情况?谢谢,现在可以滚动了,但是图像缩放仍然有问题:-(
from kivy.app import App
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.boxlayout import BoxLayout


from kivy.uix.label import Label
from kivy.uix.image import Image


import kivy
kivy.require('1.0.7')

from kivy.app import App
from kivy.uix.scatter import ScatterPlane
from kivy.uix.image import Image
from os.path import join




class SMApp(App):

    def build(self):
        layout = GridLayout(cols=1, padding=10, spacing=10,
                size_hint=(None, None), width=500)



        for i in range(80):
           la = GridLayout(cols=3, padding=10, spacing=10,
                size_hint=(None, None), width=500)
           btn = Label(text=str(i), size_hint_y=None, pos=(50,-200*i))
           filename = join(kivy.kivy_data_dir, 'logo', 'kivy-icon-256.png')
           l1 = Image(source=filename, size_hint_y=None)#,# pos=(0,-200*i), size=(50,50))
           l3 = Image(source=filename, size_hint_y=None)#, pos=(100,-200*i), size=(50,50))

           l2 = Image(source="las.jpg", size_hint_y=None, pos=(0,-200*i-100),  size=(1200,100))

           la.add_widget(btn)
           la.add_widget(l1)
           la.add_widget(l3)
           layout.add_widget(la)
           la2 = GridLayout(cols=1, padding=10, spacing=10,
                 size_hint=(None, None), width=500)

           la2.add_widget(l2)
           layout.add_widget(la2)
        layout.bind(minimum_height=layout.setter('height'))
        root = ScrollView(size_hint=(None, None), size=(500, 320),
                pos_hint={'center_x': .5, 'center_y': .5}, do_scroll_x=False)


        root.add_widget(layout)

        return root

if __name__ == '__main__':
    SMApp().run()
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout


from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout

Builder.load_string("""
<Boxes>:
    ScrollView:
        GridLayout:
            cols: 1
            BoxLayout:
                orientation: 'vertical'
                padding: 10
                BoxLayout:
                    orientation: 'horizontal'
                    Button:
                        text: "1"
                BoxLayout:
                    orientation: 'horizontal'
                    Button:
                        text: "2"
                    Button:
                        text: "3"
                    Button:
                        text: "4"
                BoxLayout:
                    orientation: 'horizontal'
                    Button:
                        text: "5"
                    Button:
                        text: "6"
                BoxLayout:
                    orientation: 'horizontal'
                    Button:
                        text: "7"
                    Button:
                        text: "8"
                    Button:
                        text: "9"
                    Button:
                        text: "10"
                BoxLayout:
                    orientation: 'horizontal'
                    Button:
                        text: "7"
                    Button:
                        text: "8"
                    Button:
                        text: "9"
                    Button:
                        text: "10"
                BoxLayout:
                    orientation: 'horizontal'
                    Button:
                        text: "7"
                    Button:
                        text: "8"
                    Button:
                        text: "9"
                    Button:
                        text: "10"

""")


class Boxes(FloatLayout):
    pass

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

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

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.image import Image
from os.path import join
from kivy.uix.gridlayout import GridLayout


Builder.load_string("""
<Boxes>:
    ScrollView:
        GridLayout:
            cols: 1
            id: gridlayout
            BoxLayout:
                orientation: 'vertical'
                id: verticalbox

""")





class Boxes(FloatLayout):
    pass

class TestApp(App):
    def build(self):
        widgets = Boxes()
        verticalbox = widgets.ids["verticalbox"]
        repeat = 10
        widgets.ids["gridlayout"].size_hint_y = repeat

        for a in range(0, repeat):

            layout1 = BoxLayout(orientation='horizontal')
            filename = join(kivy.kivy_data_dir, 'logo', 'kivy-icon-256.png')

            l1 = Image(source=filename, size_hint_y=None)#,# pos=(0,-200*i), size=(50,50))
            l3 = Image(source=filename, size_hint_y=None)#, pos=(100,-200*i), size=(50,50))

            btn1 = Label(text="aaaa", size_hint_y=None)
            btn2 = Label(text="aaaa", size_hint_y=None)
            btn3 = Label(text="aaaa", size_hint_y=None)

            layout1.add_widget(btn1)
            layout1.add_widget(btn2)
            layout1.add_widget(btn3)

            layout2 = BoxLayout(orientation='horizontal')

            btn4 = Label(text="avvvvvvvvvvvaaaaaaaaaaaaaggggggggggggggggggggggggggzzzzzzzzzzzzzzzzzzzzzzzzaaaaaaaaaaaaaaaaaa", size_hint_y=None)
            layout2.add_widget(btn4)

            layout3 = BoxLayout(orientation='horizontal')


            l2 = Image(source="jezioro.jpg")


            layout3.add_widget(l2)



            verticalbox.add_widget(layout1)
            verticalbox.add_widget(layout2)
            verticalbox.add_widget(layout3)



        return widgets

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