使用FloatLayout

时间:2017-07-06 02:54:39

标签: kivy kivy-language

这让我疯了。我试图用FloatLayout将图像定位到主窗口的顶部。下面是一个简化的例子。

似乎按钮很好,但是图像默认为100x100平方(是的,我想我已经在某处读过)并且图像的顶部边框位于屏幕的顶部,而不是图像。

如何将图像(矩形顶部)强制到窗口顶部,就像按钮一样?

Screen_showing example_button_and_image

import kivy
kivy.require('1.10.0')
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout
from kivy.config import Config

Config.set('graphics', 'width', '480')
Config.set('graphics', 'height', '800')

class MyApp(App):

    def setOrientation(self, orient):
        """"""
        self.orient = orient

    def build(self):
        return FloatLayout()

if __name__ == "__main__":
    app = MyApp()
    app.setOrientation(orient="vertical")
    app.run()


<FloatLayout>:
    Image:
        source: 'image_400x90.png'
        pos_hint: {'left':1, 'top':1}
        size_hint: None, None
        allow_stretch: False
        keep_ratio: True

    Button:
        font_size: 30
        color: 0,1,0,1
        size_hint: 0.3, 0.1
        text: "TopRight"
        pos_hint: {'right':1, 'top':1}

2 个答案:

答案 0 :(得分:1)

发生这种情况是因为图像是一个小部件而“真实图像”(图片)是该小部件的纹理,而默认情况下,图像居中并适合小部件边界框。如果您不想这样,可以将allow_stretch设置为True并将keep_ratio设置为False。docs

要了解您可以在Image Widget中添加带有矩形的画布,如下所示:

Image:
        canvas:
            Color:
                rgba: 1, 1, 1, 0.5
            Rectangle:
                pos: self.pos
                size: self.size
        source: 'dog.jpg'
        pos_hint: {'left':1, 'top':1}
        size_hint: None, None
        allow_stretch: True
        keep_ratio: False

然后你可以看到为什么图像没有做你想做的事情

enter image description here

另一张照片(图像(纹理)居中并适合小部件):

enter image description here

你可以做的一件事就是设置allow_stretch:True和keep_ratio:False 结果如下:(使用size_hint设置大小)

enter image description here

答案 1 :(得分:0)

Favcau给出了一个解决方案(并感谢),但我发现我认为更明显。它所需要的只是在kv文件中定义大小。

Image:
    id: image2
    source: 'image_400x90.jpg'
    pos_hint: {'left':1, 'top':1}
    size_hint: None, None
    size: 400, 90
    allow_stretch: True
    keep_ratio: False