kivy旋转后矩形变大
Rectangle turns big after rotating in 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()
您需要将 size_hint
设置为 None, None
以使 size
值生效。您还可以通过对 angle
使用 Property
来简化代码。这是您的 Rect
class:
的修改版本
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()
试图在 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()
您需要将 size_hint
设置为 None, None
以使 size
值生效。您还可以通过对 angle
使用 Property
来简化代码。这是您的 Rect
class:
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()