我试着掌握不同类型的坐标:
坐标。
使用该程序: class TargetUI(BoxLayout):
js_type = NumericProperty(0)
def __init__(self, **arg):
super(TargetUI, self).__init__(**arg)
btn1 = Button(text='Hello world ' + str(self.js_type))
self.add_widget(btn1)
def on_touch_up(self, touch):
# here, you don't check if the touch collides or things like that.
# you just need to check if it's a grabbed touch event
Logger.info("in touch up")
Logger.info("global coordinates: " + str(touch.pos))
if self.collide_point(*touch.pos):
touch.push()
# if the touch collides with our widget, let's grab it
touch.grab(self)
Logger.info("In widget " + str(self.js_type))
touch.apply_transform_2d(self.to_local)
Logger.info("Local coordinates " + str(touch.pos))
touch.apply_transform_2d(self.to_window)
Logger.info("Windows coordinates " + str(touch.pos))
touch.apply_transform_2d(self.to_widget)
Logger.info("Widget coordinates " + str(touch.pos))
touch.ungrab(self)
# and accept the touch.
return True
class CombWidget(Widget):
pass
class MyPaintApp(App):
def build(self):
return CombWidget()
if __name__ == '__main__':
MyPaintApp().run()
和
#:kivy 1.7.1
<CombWidget>:
tg1: tg1
tg2: tg2
tg3: tg3
BoxLayout:
size: root.size
orientation: 'vertical'
padding: 20
TargetUI:
js_type: 1
id: tg1
TargetUI:
js_type: 2
id: tg2
TargetUI:
id: tg3
js_type: 3
on_touch_up写出的所有坐标都是相同的,但预计会有一些差别。为什么所有坐标都相同?
我还希望看到Button文本以1,2或3结尾,但它们都是1.如何使Button文本依赖于self.js_type?
答案 0 :(得分:1)
这些在坐标更改时非常有用,例如,使用散点小部件,这里是一个示例,其中一个小部件放在Scatter中,您可以移动它(不知何故,当您单击它时它会恢复原位)再次,但这很方便),当你这样做时,你应该看到坐标不再相同。理解它们之间的区别留给读者一个练习:)
from kivy.base import runTouchApp
from kivy.lang import Builder
kv = '''
GridLayout:
cols: 2
spacing: 10
ClickBox
Scatter:
ClickBox:
pos: 0, 0
size: self.parent.size
Widget:
ClickBox:
pos: self.parent.pos
size: self.parent.size
<ClickBox@Widget>:
canvas:
Rectangle:
pos: self.pos
size: self.size
on_touch_move:
if self.collide_point(*args[1].pos): print self.to_window(*args[1].pos)
if self.collide_point(*args[1].pos): print self.to_parent(*args[1].pos)
if self.collide_point(*args[1].pos): print self.to_widget(*args[1].pos)
if self.collide_point(*args[1].pos): print self.to_local(*args[1].pos)
'''
if __name__ == '__main__':
runTouchApp(Builder.load_string(kv))
答案 1 :(得分:1)
RelativeLayout的文档为我澄清了这个问题。
父坐标
其他RelativeLayout类型小部件是Scatter,ScatterLayout和 滚动型。如果这样一个特殊的小部件在父堆栈中,那么只有这样 父和局部坐标系是否与窗口分开 坐标系。对于堆栈中的每个这样的小部件,一个坐标 该坐标系的(0,0)位于左下角的系统 该小部件的角落已创建。位置和触摸坐标 小部件接收和读取的坐标系最多 最近在其父堆栈中的特殊小部件(不包括其自身)或在其中 窗口坐标,如果没有。我们 称这些坐标为父坐标。
因此,您必须使用上述特殊小部件之一来使本地坐标偏离窗口坐标。 Tshirtman的答案之所以有效,是因为他使用了散点小部件,这是一个特殊的小部件。