Kivy - Scatter 小部件
Kivy 中的 Scatter 小部件对于多点触控设备特别有用,它用于旋转和放大/缩小应用程序窗口的内容。
Scatter 小部件通过在绘制子项之前更改模型视图矩阵来执行矩阵变换,并在绘制完成后恢复先前的矩阵,以便可以在整个子树上执行旋转、缩放和平移而无需更改任何小部件属性。
默认情况下,Scatter 小部件没有图形表示:它只是一个容器。其他小部件被添加到散点对象。但是,应该注意的是,Scatter 小部件不是布局。您必须自己管理子项的大小。它们相对于散点图定位,类似于 RelativeLayout。这就是为什么拖动散点图不会改变子项的位置,只有散点图的位置会改变。散点图大小不会影响其子项的大小。
Scatter 类在"kivy.uix.scatter"模块中定义。Scatter 小部件的基本用法如下 −
from kivy.uix.scatter import Scatter scatter=Scatter.add_widget(Image(source='logo.jpg'))
Scatter 对象默认启用所有交互。但是,您可能希望自定义交互,为此必须相应地定义 Scatter 对象的属性。
auto_bring_to_front − 如果为 True,小部件将自动推到父小部件列表的顶部进行绘制。
do_rotation − 允许旋转。默认情况下,此属性为 True。
do_scale − 允许缩放。默认为 True。
do_translation − 允许在 X 或 Y 轴上平移。
scale − 散点图的 Scale 值。scale 是 AliasProperty,默认为 1.0。
scale_max − 允许的最大缩放因子。允许的最大缩放的默认值最高为 1e20。
scale_min − 允许的最小缩放因子,默认值为 0.01
示例 1
以下是 Scatter 小部件如何工作的简单示例。我们刚刚在 Kivy 应用程序中的 Scatter 小部件中添加了一个标签。应用程序启动时,标签文本出现在应用程序窗口的左下角。使用鼠标将其拖动到窗口表面的任意位置。
要在普通桌面上模拟多点触控操作,请右键单击标签区域,创建两个标记,然后通过拖动这两个标记来放大或旋转标签。
如果您使用的是多点触控设备,则可以通过两根手指触摸执行缩放和旋转。
from kivy.app import App from kivy.uix.label import Label from kivy.uix.scatter import Scatter from kivy.uix.boxlayout import BoxLayout from kivy.uix.textinput import TextInput from kivy.core.window import Window Window.size = (720,350) class scatterdemoapp(App): def build(self): box=BoxLayout(orientation='vertical') scatr=Scatter() lbl=Label(text="Hello", font_size=60) scatr.add_widget(lbl) box.add_widget(scatr) return box scatterdemoapp().run()
输出
让我们看看输出是什么样子的 −
示例 2
或者,"kv"语言脚本也可用于构造相同的外观。
BoxLayout: orientation:'vertical' Scatter: Label: text:"Hello" font_size:60
让我们为上述示例添加更多交互性。在这里,我们在 Scatter 小部件上方的垂直框布局中添加了一个文本输入框。
"text"属性绑定到标签的 text 属性。因此,当您在文本框中添加/删除字母时,标签文本会更新。所有散点操作(如旋转和缩放)仍可执行。
from kivy.app import App from kivy.uix.label import Label from kivy.uix.scatter import Scatter from kivy.uix.boxlayout import BoxLayout from kivy.uix.textinput import TextInput from kivy.core.window import Window Window.size = (720,300) class scatterdemoapp(App): def build(self): box = BoxLayout(orientation='vertical') text1 = TextInput( text='Hello World', height=100, size_hint=(Window.width, None) ) box.add_widget(text1) scatr = Scatter() self.lbl = Label(text="Hello", font_size=60) text1.bind(text=self.lbl.setter('text')) scatr.add_widget(self.lbl) box.add_widget(scatr) return box scatterdemoapp().run()
输出
现在让我们检查一下输出窗口是什么样子的 −