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 对象的属性。

  1. auto_bring_to_front ——如果为 True,小部件将自动推到父小部件列表的顶部以进行绘制。

  2. do_rotation ——允许旋转。默认情况下,此属性为 True。

  3. do_scale ——允许缩放。默认值为 True。

  4. do_translation ——允许在 X 或 Y 轴上平移。

  5. scale ——Scatter 的缩放值。scale 是 AliasProperty,默认为 1.0。

  6. scale_max ——允许的最大缩放因子。允许的最大缩放的默认值为 1e20。

  7. 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()

Output

我们来看看输出是什么样子的 -

kivy scatter

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()

Output

现在我们来看看输出窗口是什么样子的 -

kivy scatter hello