我正在尝试使用 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()
这两种方法不是等价的吗?是什么导致了意外的输出?
您展示的两种方法并不等效。使用
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()