Python Kivy散射z指数

Python Kivy散射z指数,python,user-interface,kivy,Python,User Interface,Kivy,我正在尝试制作一个模拟简单生态系统的kivy应用程序,带有一种交互式地图,可以通过用户拖动来缩放和定位。我实现这一点的第一个方法是使用Kivy散射小部件,它似乎满足了这些要求。下面是我的代码,让它保持简单,只是gui按钮和地图在右边,红色的大矩形: from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.properties import ObjectProperty from kivy.graphi

我正在尝试制作一个模拟简单生态系统的kivy应用程序,带有一种交互式地图,可以通过用户拖动来缩放和定位。我实现这一点的第一个方法是使用Kivy散射小部件,它似乎满足了这些要求。下面是我的代码,让它保持简单,只是gui按钮和地图在右边,红色的大矩形:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.graphics import Rectangle, Color

class GUI(BoxLayout):

    board = ObjectProperty(None)

    def draw(self):
        with self.board.canvas:
            Color(1,0,0)
            Rectangle(pos=(0,0),size=(300,300))

class TestApp(App):

    def build(self):
        gui = GUI()
        gui.draw()
        return gui

if __name__=="__main__":
    app = TestApp()
    app.run()
和我的.kv文件:

#:kivy 1.0.9


<GUI>:
    board: scatter_board
    orientation: 'horizontal'
    spacing: 30
    padding: 30
    BoxLayout:
        size_hint: 0.25, 1
        orientation: 'vertical'
        Button:
            text: 'Start/Resume'
        Button:
            text: 'Stop'
    Scatter:
        id: scatter_board
        size_hint: 0.75,1
然而,在这种情况下,当用户在按钮上拖动地图时,就不可能再单击它了,因为单击时不会高亮显示。我试过:

将散布的“自动带到前方”设置为False 使用“散布”和“按钮”父框布局的“索引”属性来操作z索引。
因此,基本上我希望“地图”不在按钮的阴影下,而是在按钮下方。是否有可能通过散射实现这种效果?或者这是一个错误的分散用例,我应该改变方法吗?如果是这样的话,您知道任何类似且可能简单的方法吗?

为了达到您想要的结果,您需要在kv文件中使用FloatLayout

<GUI>:
    BoxLayout:
        Scatter:
            Board:
                canvas:
                    Rectangle:
                        size: (100,300)
    BoxLayout:
        orientation :"vertical"
        Button:
            text: "gi"
        Button:
            text: "gi"
别忘了导入FloatLayout,,

我也在为同样的问题挣扎。 在阅读了上面的答案后,我发现你需要把分散在自己的盒子布局。不要像我一开始做的那样使用散乱的布局,因为这样它就不会做你想做的事情,而是在按钮下面而不是上面

我是这样做的:

# Creating Scatter Class 
class TreeWidget(Scatter):
    def __init__(self, **kwargs):
        super(TreeWidget, self).__init__(**kwargs)
        #self.auto_bring_to_front = False
        ...

class ShowApp(App): 
    def build(self):
        treeBox = BoxLayout()
        self.treeWidget = TreeWidget()
        treeBox.add_widget(self.treeWidget)

        buttonFile = Button(text='File', size_hint=(None, None), size=(60, 30))
        buttonFile.bind(on_press=self.chooseFile)
        buttonSave = Button(text='Save', size_hint=(None, None), size=(60, 30))
        buttonSave.bind(on_press=self.saveFile)
        buttonBox = BoxLayout(orientation='horizontal')
        buttonBox.add_widget(buttonFile)
        buttonBox.add_widget(buttonSave)
    
        boxLayout = BoxLayout(orientation='vertical')
        boxLayout.add_widget(treeBox)
        boxLayout.add_widget(buttonBox)
        return boxLayout

请查看这篇文章,它将按钮/下拉列表放在带有散布小部件的mapview顶部抱歉,我不太明白FloatLayout的作用是什么,因为它不在代码中的任何位置,你能解释一下吗?我删除了它,所以我猜它在这里没有nee,我最初在widgetsSo的定位中使用了它,为了实现这一点,我需要使用FLoatLayout,但在这之后我可以删除它???你可以忽略FLoatLayout,那么实现这一点的实际方法是什么?使用单独的布局,按不同的顺序排列,删除绘图方法???你的回答没有解释它,我只是对它更困惑,你的方式不符合我的需要,因为我需要从.py文件内部在画布上绘制
# Creating Scatter Class 
class TreeWidget(Scatter):
    def __init__(self, **kwargs):
        super(TreeWidget, self).__init__(**kwargs)
        #self.auto_bring_to_front = False
        ...

class ShowApp(App): 
    def build(self):
        treeBox = BoxLayout()
        self.treeWidget = TreeWidget()
        treeBox.add_widget(self.treeWidget)

        buttonFile = Button(text='File', size_hint=(None, None), size=(60, 30))
        buttonFile.bind(on_press=self.chooseFile)
        buttonSave = Button(text='Save', size_hint=(None, None), size=(60, 30))
        buttonSave.bind(on_press=self.saveFile)
        buttonBox = BoxLayout(orientation='horizontal')
        buttonBox.add_widget(buttonFile)
        buttonBox.add_widget(buttonSave)
    
        boxLayout = BoxLayout(orientation='vertical')
        boxLayout.add_widget(treeBox)
        boxLayout.add_widget(buttonBox)
        return boxLayout