Kivy - прямоугольник привязывается к изображению с задержкой - PullRequest
1 голос
/ 15 июня 2019

Я хочу, чтобы прямоугольник придерживался нижнего левого угла изображения.Это работает, но когда я изменяю размер окна, прямоугольник немного отключается.Это где изображение было до обновления.Вот код:

from kivy.app import App, Builder
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.graphics import Rectangle
from kivy.graphics import Color


Builder.load_string(
'''
<Screen>:
    canvas.before:
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:
        Image:
            id: im
            keep_data: True
            source: 'test.png'
            allow_stretch: True
            size_hint_y: 0.9
            pos_hint: {'left':1, 'top':1}
        Button:
            text: 'Button'
            size_hint_y: 0.1
            pos_hint: {'x':0, 'y':0}
''')


class Screen(FloatLayout):
    def __init__(self, **kwargs): 
        super(Screen, self).__init__(**kwargs) 
        with self.ids.im.canvas.after:
            Color(1,0,1,.5) 
            self.rec = Rectangle(pos=(self.ids.im.center_x - self.ids.im.norm_image_size[0] / 2,
                                      self.ids.im.center_y - self.ids.im.norm_image_size[1] / 2),
                                 size=(self.ids.im.norm_image_size[0]/2,
                                       self.ids.im.norm_image_size[1]/2))
        self.bind(pos=self.update_canvas, size=self.update_canvas)

    def update_canvas(self, *args):
        self.rec.pos = (self.ids.im.center_x - self.ids.im.norm_image_size[0] / 2,
                        self.ids.im.center_y - self.ids.im.norm_image_size[1] / 2)
        self.rec.size = (self.ids.im.norm_image_size[0]/2,
                         self.ids.im.norm_image_size[1]/2)


class QuestionApp(App):
    def build(self):
        return Screen()

if __name__ == "__main__":
    QuestionApp().run()

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

1 Ответ

1 голос
/ 17 июня 2019

Если вы хотите, чтобы прямоугольник использовал геометрию изображения в качестве эталона, вы должны выполнить связывание с изображением, для этого изменения:

self.bind(pos=self.update_canvas, size=self.update_canvas)

до

self.ids.im.bind(pos=self.update_canvas, size=self.update_canvas)
...