【问题标题】:Kivy. Why size_hint doesn't work at widget?基维。为什么 size_hint 在小部件上不起作用?
【发布时间】:2019-08-11 15:45:50
【问题描述】:

我想使用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 图像的黑色窗口。

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:

    问题是您将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 拉伸源。

    【讨论】:

      【解决方案2】:

      问题

      为什么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)。因此,通过在实例化 Image 小部件时提供 size_hint=(1, 1),您不会更改默认的 size_hintsize
      2. 当您向超级构造函数提供size=[1280, 960] 时,您已经覆盖了(100, 100) 的小部件的默认size 或(1, 1) 的默认size_hint

      解决方案

      如果将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
      

      输出

      【讨论】:

        猜你喜欢
        • 2012-11-25
        • 1970-01-01
        • 2021-11-12
        • 2021-01-04
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        相关资源
        最近更新 更多