首页 > 解决方案 > 在kivy中旋转后矩形变大

问题描述

试图在 kivy 中旋转一个矩形,但遇到了盲点。屏幕上有一个按钮,每次点击它都会旋转一个矩形,但当它旋转时它也会变得更大。为什么会发生这种情况,我该如何解决?也将不胜感激任何有关整体代码的提示。主文件:

import kivy

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle
from kivy.graphics import Rotate
from kivy.graphics.context_instructions import PushMatrix, PopMatrix
from kivy.properties import ObjectProperty


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


        self.angle = 0
        self.x, self.y = 500,500
        self.pos = self.x, self.y
        self.size = (50,100)
        
        with self.canvas:
            PushMatrix()
            Rectangle(pos=self.pos, size=self.size)
            
            PopMatrix()
    
    def rotate(self):
        
        with self.canvas.before:
            self.canvas.clear()
            PushMatrix()
            Rotate(pos=self.pos, angle=0)
            Rectangle(pos=self.pos, size=self.size)
            
            PopMatrix()


class MainScreen(Widget):
    rect = ObjectProperty(None)
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        
        
        
    def pressed(self):
        self.rect.rotate()



class MainApp(App):
    def build(self):
        return MainScreen()

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

和 kv 文件:

<MainScreen>:
    rect: rect
            
    FloatLayout:
        size: root.width, root.height
        
        Rect:
            id: rect
        
        Button:
            angle: 0
            text: "press"
            pos_hint: {"x": 0.1, "y": 0.1}
            size_hint: (.1,.1)
            on_press: root.pressed()

标签: pythonkivy

解决方案


您需要设置size_hintNone, None使这些size值生效。您还可以通过使用Propertyfor 来简化代码angle。这是您的Rect课程的修改版本:

class Rect(Widget):
    angle = NumericProperty(0)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.size_hint = (None, None)
        self.x, self.y = 500, 500
        self.pos = self.x, self.y
        self.size = (50, 100)

    def rotate(self):
        self.angle += 45

然后,你kv可以看起来像:

<Rect>:
    canvas.before:
        PushMatrix
        Rotate:
            origin: self.center
            angle: self.angle
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size
    canvas.after:
        PopMatrix
        
<MainScreen>:
    rect: rect
            
    FloatLayout:
        size: root.width, root.height
        
        Rect:
            id: rect
        
        Button:
            angle: 0
            text: "press"
            pos_hint: {"x": 0.1, "y": 0.1}
            size_hint: (.1,.1)
            on_press: root.pressed()

推荐阅读