Python KIvy 旋转矩形在调整大小时移动

问题描述

我有一个旋转的矩形,当我调整它的大小时,它会稍微改变它的位置。 但我不希望它移动...

发生这种位置变化,当我重置中心时,如果我不改变中心,它不会移动,但对我来说中心是正确的很重要。

我创建了 2 个视频。 这是目前:https://youtu.be/TqY3Ji0rnLw 这就是我想要的(我删除了中心重置,但正如我之前说过的,我想要一个中心重置):https://youtu.be/Jfq777nzu6o

我该如何解决这个问题?

这是我的代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color,Rectangle,PushMatrix,Rotate,PopMatrix
from kivy.clock import Clock
from kivy.core.window import Window



class Canvas:
    def __init__(self,root,pos,size,rotation=0,color=(1,1)):
        with root.canvas:
            PushMatrix()
            self._color_instruction = Color(rgba=color)
            self._rotation_instruction = Rotate(angle=rotation,origin=(150,150))
            self._rectangle_instruction = Rectangle(pos=pos,size=size)
            PopMatrix()

    @property
    def center(self):
        pos = self.pos
        size = self.size
        center_x = pos[0] + size[0] / 2
        center_y = pos[1] + size[1] / 2
        return (center_x,center_y)

    @property
    def pos(self):
        return self._rectangle_instruction.pos

    @pos.setter
    def pos(self,value):
        self._rectangle_instruction.pos = value
        self._rotation_instruction.origin = self.center

    @property
    def size(self):
        return self._rectangle_instruction.size

    @size.setter
    def size(self,value):  
        self._rectangle_instruction.size = value
        self._rotation_instruction.origin = self.center

    @property
    def rotation(self):
        return self._rotation_instruction.angle

    @rotation.setter
    def rotation(self,value):
        self._rotation_instruction.angle = value

    @property
    def color(self):
        return self._color_instruction.rgba

    @color.setter
    def color(self,value):
        self._color_instruction.rgba = value


class Root(Widget):
    def __init__(self,**kwargs):
        super(Root,self).__init__(**kwargs)

        self.rectangle = Canvas(self,(100,100),rotation=45)

        self.keys_pressed = set()

        self._keyboard = Window.request_keyboard(self._on_keyboard_closed,self)
        self._keyboard.bind(on_key_down = self._on_key_down)
        self._keyboard.bind(on_key_up = self._on_key_up)

        Clock.schedule_interval(self.step,0)

    def step(self,dt):
        x = self.rectangle.pos[0]
        y = self.rectangle.pos[1]
        width = self.rectangle.size[0]
        height = self.rectangle.size[1]
        rotation = self.rectangle.rotation

        step_size = 300 * dt

        if "up" in self.keys_pressed:
            y += step_size
        if "left" in self.keys_pressed:
            x -= step_size
        if "right" in self.keys_pressed:
            x += step_size
        if "down" in self.keys_pressed:
            y -= step_size
        if "y" in self.keys_pressed:
            rotation += step_size
        if "x" in self.keys_pressed:
            rotation -= step_size
        if "w" in self.keys_pressed:
            height = min(height + step_size,300)
        if "a" in self.keys_pressed:
            width = max(width - step_size,10)
        if "d" in self.keys_pressed:
            width = min(width + step_size,300)
        if "s" in self.keys_pressed:
            height = max(height - step_size,10)

        self.rectangle.pos = (x,y)
        self.rectangle.size = (width,height)
        self.rectangle.rotation = rotation

    def _on_keyboard_closed(self):
        self._keyboard.unbind(_on_key_down = self._on_key_down)
        self._keyboard.ubind(_on_key_up = self._on_key_up)

        self._keyboard = None

    def _on_key_down(self,keyboard,keycode,text,modifiers):
        self.keys_pressed.add(text if text != None else keycode[1])

    def _on_key_up(self,keycode):
        if keycode[1] in self.keys_pressed:
            self.keys_pressed.remove(keycode[1])


class TestApp(App):
    def __init__(self,**kwargs):
        super(TestApp,self).__init__(**kwargs)

    def build(self):
        return Root()


def main():
    app = TestApp()
    app.run()


if __name__ == "__main__":
    main()

我该如何改变它在第二个视频中的位置?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)