绘制另一个小部件包含的小部件

时间:2015-02-16 11:26:20

标签: python kivy

我正在尝试了解kv文件的工作原理。 到目前为止,我已经能够解决一些错误,但是我坚持使用不产生错误但不会产生预期结果的东西。

预期: 我的目标是创建一个父窗口小部件,其中包含子窗口小部件的两个等值。子小部件包含矩形和触摸移动指令。我希望每个实例只覆盖主要小部件的一部分(矩形在这里让我看到子小部件的位置)。我假设触摸移动指令应仅在子窗口小部件实例所在的屏幕部分触发。

实际值: 子窗口小部件矩形不显示,并且触摸移动行为在任何地方被触发两次(这使得两个子窗口小部件跨越整个屏幕但未显示矩形)。 删除父窗口小部件画布不能解决我的问题,也不能只添加一个子窗口小部件。

我做错了什么?

python文件:

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

class MainWidget(Widget):
    pass

class SubWidget(Widget):
    def on_touch_move(self, touch):
        self.center_x, self.center_y = (touch.x, touch.y)
        print touch.x, touch.y

class testApp(App):
    def build(self):
        x = MainWidget()
        return x

if __name__ == '__main__':
    testApp().run()

kv文件:

#:kivy 1.8.0

<MainWidget>:
    canvas:
        Color:
            rgb: 0,1,0
        Rectangle:
            pos: self.center
            size: 10,10
    SubWidget:
        pos: self.width - self.width/5 ,0
        size: self.width/5 , self.height
    SubWidget:
        pos: 0, 0
        size: self.width/5 , self.height

<SubWidget>:
    canvas:
        Color:
            rgb: 1,0,0
        Rectangle:
            pos: self.pos
            size: self.size

提前感谢您的回答。

编辑: 1)应在布局中添加子窗口小部件。还是需要找到一种方法 将我的小部件正确放置在布局中。 2)即使未直接点击窗口小部件,也会触发窗口小部件的触摸事件。使用widget.collide_point(* touch.pos)使其工作。

edit2: 修正了.kv。 Self.parent.pos / size表现不一致所以我转移到root.pos / size:

#:kivy 1.8.0

<MainWidget>:
    canvas:
        Color:
            rgb: 0,1,0
        Rectangle:
            pos: self.center
            size: 10,10
    FloatLayout:
        SubWidget:
            pos: root.width - root.width/5 ,0
            size: root.width/5 , root.height
        SubWidget:
            pos: 0, 0
            size: root.width/5 , root.height

<SubWidget>:
    canvas:
        Color:
            rgb: 1,0,0
        Rectangle:
            pos: self.pos
            size: self.size

2 个答案:

答案 0 :(得分:3)

我相信您需要将子元素放入box layout。 所以它会是这样的。

<MainWidget>:
    canvas:
        ...
    BoxLayout:
        SubWidget:
            ...
        SubWidget:
            ...

SubWidget元素的属性(如pos)可能需要进行一些更改。

还有一些信息here

答案 1 :(得分:2)

  

我认为触摸移动指令只应在子窗口小部件实例所在的屏幕部分触发。

这个假设是不正确的。要自行检查碰撞,可以使用if self.collide_point(*touch.pos): ...方法on_touch_move进行检查。

此外,您的定位问题是由仅使用小部件引起的 - 这些小部件不会对其子级施加任何内容,因此除根小部件之外的所有内容都具有默认的pos(0,0)和大小(100,100)。您应该使用布局类来使窗口小部件自动调整大小并定位其子项。