我试图在我的小部件的中心绘制一个矩形:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle
class MyWidget(Widget):
def __init__(self):
super(MyWidget, self).__init__()
with self.canvas:
Rectangle(pos=(self.center_x, self.center_y)
class MyApp(App):
def build(self):
return MyWidget()
if __name__ == '__main__':
MyApp().run()
这就是我得到的:
使用.kv
文件执行完全相同的操作:
<MyWidget>:
canvas:
Rectangle:
pos: self.center_x, self.center_y
请解释如何实现我尝试做的事情,以及为什么它使用.kv
文件而不是Python代码。谢谢
答案 0 :(得分:0)
如果从kv文件添加Widget,则窗口小部件将自动附加到App的根属性,并用作应用程序窗口小部件树的基础。因此,在您的情况下,从kv文件中,窗口小部件的大小会自动绑定到应用程序窗口大小,并成为根窗口小部件。考虑到这一点,self.center_x和self.center_y有效。您可以在https://kivy.org/docs/guide/lang.html下的“MyApp - &gt;”行下阅读此内容。 my.kv。
当不使用kv文件时,这不会发生,并且小部件的默认大小将是(100,100)。要正确放置矩形,请使用布局,以便您可以引用size_hint来正确放置或重新调整任何子窗口小部件的大小。如文档中所述
FloatLayout尊重其子项的pos_hint和size_hint属性。
https://kivy.org/docs/api-kivy.uix.floatlayout.html#kivy.uix.floatlayout.FloatLayout
因此,在示例中创建一个Float布局,添加一个pos_hint等于center_x和center_y的小部件,它将引用作为父级的布局,然后将一个矩形绘制到小部件。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics import Rectangle
from kivy.core.window import Window
class myLayout(FloatLayout):
def __init__(self):
super(myLayout, self).__init__()
self.size = Window.size
self.myWidget = Widget(size=(100,100))
self.add_widget(self.myWidget)
with self.myWidget.canvas:
Rectangle(pos=(self.center_x, self.center_y))
class MyApp(App):
def build(self):
return myLayout()
if __name__ == '__main__':
MyApp().run()