Я пытаюсь сделать приложение kivy для моделирования простой экосистемы, с видом интерактивной карты, которую можно масштабировать и позиционировать путем перетаскивания пользователем. Мой первый подход к достижению этого - использовать виджет Kivy Scatter, который, похоже, удовлетворяет этим требованиям. Здесь мой код (чтобы он был простым, просто 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
Однако в этой ситуации, когда пользователь перетаскивает карту по кнопке, невозможно щелкнуть ее (она не будет подсвечиваться при нажатии). Я старался:
Поэтому в основном я хочу, чтобы "карта" не затеняла кнопку, а оставалась ниже нее. Можно ли добиться этого эффекта с помощью Scatter? Или это неправильный вариант использования разброса, и я должен изменить подход? Если да, знаете ли вы какие-либо схожие и, возможно, простые способы?
для достижения желаемого результата вам необходимо использовать FloatLayout в вашем файле kv.
<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,