1

私はさまざまなタイプの座標を理解しようとしています:

  1. グローバル、
  2. ローカル、
  3. 窓と
  4. ウィジェット

座標。

プログラムの使用: クラス 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 によって書き出されたすべての座標は同じですが、多少の違いが予想されます。なぜすべての座標が同じなのですか?

ボタンのテキストが 1、2、または 3 で終わることも期待していましたが、すべて 1 です。ボタンのテキストを self.js_type に依存させるにはどうすればよいですか?

4

2 に答える 2

1

これらは、座標の変更がある場合に役立ちます。例えば、散布ウィジェットで、ウィジェットの 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))
于 2013-09-11T22:23:12.620 に答える