代码之家  ›  专栏  ›  技术社区  ›  Snow bunting

Kivy:分散内部分散

  •  1
  • Snow bunting  · 技术社区  · 7 年前

    问题:我如何放置一个 Scatter 在另一个内部 分散 ?

    我对kivy的坐标有些问题。原则上我想 分散 在a中 分散 。它们应该是可拖动的(移动第一个散点移动所有内容,移动第二个散点将第二个散点移动到第一个散点内)。

    混凝土设置

    1. 我想有一个可缩放和可移动的底图(散点图1)。当我们变换此地图时,在此地图“顶部”绘制的所有内容也应变换(s.t.它保持其在地图上的位置)。

    2. 然后我想在地图的顶部绘制一个网格,它可以自己移动(散点2)。

    3. 然后我在散点2上加上一些点。

    4. 重新缩放窗口时,必须保留相对位置。

    预期行为

    当我抓取散点2时,它可以四处移动和点(3)保持相对于散布2。当我抓取散点1时,它应该移动所有s.t.散点2,并且点保持在地图上的位置(散点1)。

    基本示例代码

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.lang import Builder
    
    kv = """
    <MyRoot>:
        orientation: 'vertical'
        ActionBar:
            ActionView:
                ActionPrevious:
                    title: ''
                    with_previous: True
                ActionOverflow:
                    ActionButton:
                        text: 'Preferences'
                        on_press: app.open_settings()
        Scatter:
            canvas:
                Color:
                    rgb: .2, .2, .3
                Rectangle:
                    pos: self.pos
                    size: self.size
            Scatter:
    
                canvas:
                    Color:
                        rgb: .8, .2, .3
                    Rectangle:
                        pos: self.pos
                        size: self.size
                Widget:
                    pos: 200, 200
                    canvas:
                        Color:
                            rgb: .1, .7, .3
                        Ellipse:
                            pos: 30,50
                            size: 10, 10
    """
    Builder.load_string(kv)
    
    
    class MyApp(App):
        def build(self):
            return MyRoot()
    
    
    class MyRoot(BoxLayout):
        pass
    
    
    if __name__ == '__main__':
        MyApp().run()
    

    这里还有正在发生的事情的图像。我想将绿点固定在红色散点上,红色散点位于紫色散点内: enter image description here

    方法

    我想我必须在每个步骤中转换坐标并覆盖函数 on_touch_... ,可能使用 self.parent.to_parent(*touch.pos) 但不幸的是,我没能把所有的东西都拼凑起来。

    谢谢你的帮助!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Snow bunting    7 年前
    Rectangle:
        size: self.size
    

    这是一个相对布局,因此我们需要: pos: 0,0 而不是 pos: self.pos