Kivy Scatter z-index

时间:2018-06-17 15:27:35

标签: python user-interface kivy

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

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

然而,在这种情况下,当用户将地图拖到按钮上时,再也不能点击它(在点击时不会突出显示)。我试过了:

  • 将散点图''auto_bring_to_front'设置为False
  • 使用散点图和按钮的父BoxLayout的'index'属性来操纵z-index。

所以基本上我希望'地图'不要遮挡按钮,而是留在它下面。使用Scatter可以实现这种效果吗?或者它是分散的错误用例,我应该改变方法吗?如果是这样,你知道任何类似的,可能很简单的方法吗?

2 个答案:

答案 0 :(得分:0)

我在同一个问题上挣扎。 阅读以上答案后,我发现您需要将Scatter放入其自身的BoxLayout中。而且不要像我最初那样使用ScatterLayout,因为那样的话它将无法完成您想要的操作(转到按钮下方而不是按钮上方)。

我是这样做的:

# 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

答案 1 :(得分:-1)

为了达到理想的效果,你需要在你的kv文件中使用FloatLayout ..

<GUI>:
    BoxLayout:
        Scatter:
            Board:
                canvas:
                    Rectangle:
                        size: (100,300)
    BoxLayout:
        orientation :"vertical"
        Button:
            text: "gi"
        Button:
            text: "gi"

将其添加到主文件

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 Board(Widget):
    pass

class TestApp(App):
    def build(self):
        gui = GUI()
        # gui.draw()
        return gui

if __name__=="__main__":
    app = TestApp()
    app.run()

别忘了导入FloatLayout ,, enter image description here