Kivy不同类型的坐标

时间:2013-09-10 22:14:04

标签: layout coordinates kivy

我试着掌握不同类型的坐标:

  1. 全局,
  2. 本地,
  3. 窗口和
  4. 的widget
  5. 坐标。

    使用该程序:     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?

2 个答案:

答案 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的答案之所以有效,是因为他使用了散点小部件,这是一个特殊的小部件。