为什么这个矩形不以Kivy为中心?

时间:2016-04-26 15:53:00

标签: python user-interface kivy

我试图在我的小部件的中心绘制一个矩形:

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()

这就是我得到的:

Image indeed

使用.kv文件执行完全相同的操作:

<MyWidget>:
    canvas:
        Rectangle:
            pos: self.center_x, self.center_y

请解释如何实现我尝试做的事情,以及为什么它使用.kv文件而不是Python代码。谢谢

1 个答案:

答案 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()