Как сделать так, чтобы изображение «плавало» над кнопками? - PullRequest
0 голосов
/ 22 февраля 2019

Я начинаю изучать Киви.Приведенный ниже код создает сетку кнопок 10x10:

from kivy.uix.gridlayout import GridLayout
from kivy.app import App
from kivy.uix.button import Button


class MyApp(App):
    def build(self):
        layout = GridLayout(cols=10)
        for i in range (1, 101):
            layout.add_widget(Button(text=str(i)))
        return layout

MyApp().run()

enter image description here

Теперь я хотел бы добавить изображение PNG в независимый слой, которыйслучайным образом «бродят» по этим кнопкам независимо друг от друга.

enter image description here

Затем пользователь должен нажать на кнопку, на которую идет изображение, как в игре.

То есть изображение не должно быть кликабельным и будет отображаться только над кнопками, при этом кнопки должны реагировать идеально, как будто над ними нет изображения.Как это сделать?

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете нарисовать изображение в Canvas из GridLayout, используя Rectangle.И позиция может быть обновлена ​​с помощью Clock_schedule_interval().Например:

from kivy.clock import Clock
from kivy.graphics.context_instructions import Color
from kivy.graphics.vertex_instructions import Rectangle
from kivy.uix.gridlayout import GridLayout
from kivy.app import App
from kivy.uix.button import Button


class MyApp(App):
    def build(self):
        layout = GridLayout(cols=10)
        with layout.canvas.after:
            Color(1,1,1,0.5)  # if you want to see through the image
            self.bg = Rectangle(source='KQxab.png') # source is the image
        for i in range (1, 101):
            layout.add_widget(Button(text=str(i)))
        Clock.schedule_interval(self.update_bg, 1.0/24.0)  # schedule the image movement
        return layout

    def update_bg(self, dt):
        self.bg.pos = (self.bg.pos[0] + 1, self.bg.pos[1] + 1)


MyApp().run()

Этот код просто перемещает изображение по прямой линии, но вы можете улучшить это.

...