我正在尝试了解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
答案 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)。您应该使用布局类来使窗口小部件自动调整大小并定位其子项。