python - 在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
值生效。您还可以通过使用Property
for 来简化代码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()
推荐阅读
- android - 如何将图像从 Odoo 11 上传到 Android 应用程序?
- sql - 两个日期之间的工作日与日历表
- php - 在 laravel 中包含 js 文件的最佳方法是什么?
- java - 允许两个类共享变量和方法
- angular - 使用嵌套订阅返回布尔值的函数
- bash - 生成命令(unimrcp 客户端)的 Unix shell 脚本不返回
- javascript - 为什么来自 nextElementSibling.tagName 的 TypeError?
- java - Java- 使用多个测试用例和每个测试用例中的多个值扫描以下输入的代码片段
- jquery - CTRL + P 打印不超过 1 页
- html - 未从 HTML 表单中的移动浏览器中为 Tab/Next 键发出 Keydown 事件