Kivy 简明教程
Kivy - Scatter
Kivy 中的 Scatter 小部件对于多点触控设备特别有用,其中它用于旋转和缩放上下应用窗口的内容。
Scatter 小部件在绘制子级之前通过更改模型视图矩阵来执行矩阵变换,并且在完成绘制后还原先前的矩阵,以便可以在整个子级树上执行旋转、缩放和平移,而不更改任何小部件属性。
默认情况下,Scatter 小部件没有图形表示:它只是一个容器。其他小部件被添加到 Scatter 对象。但需要注意的是,Scatter 小部件不是布局。你必须自己管理子级的大小。它们相对于 Scatter 的位置,类似于 RelativeLayout。这就是为什么拖动 Scatter 不会改变子级的位置,而只会改变 Scatter 的位置。Scatter 的大小不影响其子级的大小。
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 ——Scatter 的缩放值。scale 是 AliasProperty,默认为 1.0。
-
scale_max ——允许的最大缩放因子。允许的最大缩放的默认值为 1e20。
-
scale_min - 允许的最小缩放因子,默认值为 0.01
Example 1
以下是如何使用分散小部件工作的简单示例。我们在 Kivy 应用程序中的分散小部件中添加了一个标签。该应用程序从标签文本出现在应用程序窗口的左下角开始。使用鼠标将其拖到窗口表面的任意位置。
若要模拟在普通桌面上进行多点触控操作,请通过右键单击鼠标在标签区域创建两个标记,然后你可以通过拖动这两个标记来放大或旋转标签。
如果你使用的是多点触控设备,你可以通过双指触摸来执行缩放和旋转。
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()
Example 2
或者,“kv”语言脚本也可以用于构建相同的外观。
BoxLayout:
orientation:'vertical'
Scatter:
Label:
text:"Hello"
font_size:60
让我们为上面的示例添加一些更多的交互性。这里,我们已在垂直盒布局中向分散小部件上方添加了一个文本输入框。
“文本”属性绑定到标签的文本属性。因此,当你从文本框中添加/删除字母时,标签文本将得到更新。仍然可以执行所有分散操作,例如旋转和缩放。
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()