在调整窗口时如何在Kivy中的图像之间保持固定的宽度?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在调整窗口时如何在Kivy中的图像之间保持固定的宽度?相关的知识,希望对你有一定的参考价值。

我有一些图像,尺寸均为680 x 1000像素。我在Kivy中设置了水平滚动视图(使用python),我想在其上显示这些图像。问题是,当我调整窗口大小时,图像之间的空间会改变。到目前为止,这是我的代码:

import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.rows = 1
        self.size_hint = None, .8
        self.bind(minimum_width=self.setter('width'))    

class MyBox(BoxLayout):
    def __init__(self, **kwargs):
        super(MyBox, self).__init__(**kwargs)
        self.orientation = "vertical"
        self.size_hint_x = None
        self.bind(minimum_width=self.setter('width'))    

class ScrollViewApp(App):
    def build(self):
        base = FloatLayout()
        grid = MyGrid()
        grid.width = 680
        box = MyBox()
        box.add_widget(Widget(size_hint_y=.1))
        box.add_widget(grid)
        box.add_widget(Widget(size_hint_y=.1))

        img = Image(source="img.jpg", allow_stretch=True, keep_ratio=True)
        img.stretch = True
        img.size = grid.size
        grid.add_widget(img)
        img = Image(source="img2.jpg", allow_stretch=True, keep_ratio=True)
        img.stretch = True
        img.size = grid.size
        grid.add_widget(img)

        scroll = ScrollView(do_scroll_y=False, pos_hint="center_y": .5)
        scroll.add_widget(box)
        base.add_widget(scroll)
        return base    

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

我发现这篇文章很有用,尽管它似乎并没有解决我所需要的一切:kivy image button size and position

如果我在图像中拥有最大尺寸的图像,则会得到以下信息:

Images Squeezed Together

这些图像太靠近!另一方面,如果我缩小窗口,则会得到以下信息:

Images Too Far Apart

现在它们相距太远了!如何使图像随着大小的增长或缩小而彼此保持相同的水平距离?即使我在MyGrid()类中添加了填充,我仍然遇到相同的问题。

答案

我更喜欢让Kivy为我做绑定,所以我的解决方案使用kv

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.image import Image


class MyImage(Image):
    pass


theRoot = Builder.load_string('''
ScrollView:
    do_scroll_y: False
    BoxLayout:
        id: box
        orientation: 'horizontal'
        spacing: 10
        size_hint: None, 1.0
        width: self.minimum_width    # binds BoxLayout width to the sum of child widths (plus spacing, padding, etc)
<MyImage>:
    size_hint: None, 1.0
    allow_stretch: True
    keep_ratio: True
    width: self.height * self.image_ratio    # set width (needed for BoxLayout minimum width calculations)
''')


class ScrollViewApp(App):
    def build(self):
        box = theRoot.ids.box
        img = MyImage(source="img.jpg")
        box.add_widget(img)
        img = MyImage(source="img2.jpg")
        box.add_widget(img)
        return theRoot

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

以上是关于在调整窗口时如何在Kivy中的图像之间保持固定的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

保持视差固定但在滚动时更改图像?

固定 Kivy 程序的窗口大小

如何在保持宽高比的同时将图像调整为固定的宽度和高度?

如何使 SVG 宽度响应但保持 SVG 高度不变?

如何保持并排图像的纵横比,保持图像高度相同并在图像之间固定填充?

ExtJs 4 - 调整窗口大小时未保持 TextField 高度