我正在尝试制作一个用于模拟简单生态系统的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
然而,在这种情况下,当用户将地图拖到按钮上时,再也不能点击它(在点击时不会突出显示)。我试过了:
所以基本上我希望'地图'不要遮挡按钮,而是留在它下面。使用Scatter可以实现这种效果吗?或者它是分散的错误用例,我应该改变方法吗?如果是这样,你知道任何类似的,可能很简单的方法吗?
答案 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()