如何在 Kivy 中使用 self.size 而不使用 kv 文件?

问题描述 投票:0回答:1

我正在尝试使用 Kivy 创建一个简单的应用程序,其中图像填充整个小部件。我使用 kv 文件为此编写了代码,效果很好。但是,如果我尝试将其完全放在 python 文件中,则它不起作用,并且

self.size
给出值
(100, 100)
,这会导致窗口左下角出现 100 x 100 的图像。

这是我的 kv 文件方法的代码:

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


class MainWidget(Widget):
    pass


class MainApp(App):
    def build(self):
        return MainWidget()


MainApp().run()

kv 文件:

<MainWidget>:
    canvas.before:
        Rectangle:
            source: "background.jpg"
            size: self.size

这是我尝试将其完全放入 python 文件中:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import *


class MainWidget(Widget):
    def __init__(self, **kwargs):
        super(MainWidget, self).__init__(**kwargs)
        with self.canvas.before:
            Rectangle(size = self.size, source = "background.jpg")


class MainApp(App):
    def build(self):
        return MainWidget()


MainApp().run()

这两种方法不是等价的吗?是什么导致了意外的输出?

python kivy kivy-language
1个回答
0
投票

您展示的两种方法并不等效。使用

kv
的主要优点之一是它会自动为您设置绑定。所以
kv
代码:

size: self.size

设置绑定,以便每当

size
MainWidget
发生变化时,
size
Recrangle
都会调整为相同。

在不使用

kv
的代码中,不会创建此类绑定。在该代码中,当以下代码时,设置
size
Rectangle

Rectangle(size = self.size, source = "background.jpg")

被执行。此时,

size
MainWidget
仍为
(100 100)
的默认值,位置为
(0, 0)
的默认值。如果您希望更新
size
Rectangle
,则必须提供代码来执行此操作。以下是一种方法的示例:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import *


class MainWidget(Widget):
    def __init__(self, **kwargs):
        super(MainWidget, self).__init__(**kwargs)
        with self.canvas.before:
            self.rect = Rectangle(size = self.size, source = "background.jpg")

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


class MainApp(App):
    def build(self):
        return MainWidget()


MainApp().run()
© www.soinside.com 2019 - 2024. All rights reserved.