基维为什么size_hint在小部件上不起作用?

时间:2019-08-11 15:45:50

标签: python python-3.x kivy

我想使用size_hint缩放小部件中的图像,但是不起作用。我做错了什么?

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.image import Image


class Game(Widget):
    def __init__(self):
        super().__init__(size=[1280, 960])
        self.add_widget(Image(source='img.jpg', size_hint=(1, 1)))


class GameApp(App):
    def build(self):
        gm = Game()
        return gm


GameApp().run()

结果,我看到一个带有100x100图像的黑色窗口。

2 个答案:

答案 0 :(得分:0)

问题是您要将Image添加到扩展Widget的类中。 Widget类不能用作容器,并且不能处理类似size_hint的事情。因此,我建议更改Game以扩展某种类型的容器,例如FloatLayout。这是您所做的更改的代码:

class Game(FloatLayout):
    def __init__(self):
        super().__init__(size=[1280, 960])
        self.add_widget(Image(source='img.jpg', size_hint=(1,1), allow_stretch=True))

您可能需要allow_stretch=True来允许Image拉伸源。

答案 1 :(得分:0)

问题

  

为什么size_hint对小部件不起作用?

答案

  1. 您提供的关键字size_hint不适用于 小部件。它应用于Image对象。 The base class of Image widget is a WidgetThe default size of a widget is (100, 100) and default size_hint is (1, 1)。因此,通过在实例化图像窗口小部件时提供size_hint=(1, 1),就不会更改默认的size_hintsize
  2. 向超级构造函数提供size=[1280, 960]时,您已经覆盖(100,100)的窗口小部件的默认size或(1,1)的默认size_hint < / li>

解决方案

如果将pos=self.pos, size=self.size, allow_stretch=True)添加到Image,则会显示图像。

但是底部仍然有一条黑条。

摘要

self.add_widget(Image(source='Jupiter.png', pos=self.pos, size=self.size, allow_stretch=True))

推荐的解决方案。

您可以通过执行以下操作来替换Image对象:

  1. 使用小部件的canvasRectangle中显示图像
  2. 将小部件的possize绑定到redraw图像的方法上
  3. 添加导入语句from kivy.graphics import Rectangle

摘要

from kivy.graphics import Rectangle

class Game(Widget):
    def __init__(self):
        super().__init__(size=[1280, 960])
        with self.canvas:
            self.rect = Rectangle(source="Jupiter.png", pos=self.pos, size=self.size)
        self.bind(pos=self.redraw, size=self.redraw)

    def redraw(self, *args):
        self.rect.size = self.size
        self.rect.pos = self.pos

输出

Recommnded Solution