Kivy 简明教程

Kivy - Stencil View

Kivy 库中的 StencilView 小组件限制了添加到它的其他子小组件的画布区域。尝试绘制在模板视图区域之外的任何指令都将被剪切。

StencilView 小组件在内部使用模板图形指令。它提供了一种有效的方法来剪切子组件的绘图区域。

StencilView 类在“kivy.uix.stencilview”模块中定义。

from kivy.uix.stencilview import StencilView

请注意,StencilView 不是一个布局。因此,要将小组件添加到 StencilView,您必须组合一个 StencilView 和一个 Layout 才能实现布局的行为。此外,您不能将超过 128 个支持模板的小组件添加到 StencilView。

StencilView 的一般用法如下 −

st = StencilView(size=(x,y))
w = Widget()
st.add_widget(w)

为了了解 StencilView 如何确切地限制小组件的可绘制区域,让我们首先执行某些图形绘制指令,然后施加 StencilView 来查看差异。

Example

在以下代码中,一个 mywidget 类扩展了 Widget 类,并随机位置绘制了 200 个圆,其 RGB 值也随机。(这还未使用 StencilView)

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import *
import random
from kivy.core.window import Window

Window.size = (720, 350)
class mywidget(Widget):
   def __init__(self, *args):
      super().__init__(*args)
      for i in range(200):
         colorR = random.randint(0, 255)
         colorG = random.randint(0, 255)
         colorB = random.randint(0, 255)
         posx = random.randint(0, Window.width)
         posy = random.randint(0, Window.height)
         self.canvas.add(Color(rgb=(colorR / 255.0, colorG / 255.0, colorB / 255.0)))
         d = 30
         self.canvas.add(Ellipse(pos=(posx, posy), size=(d, d)))

class circlesapp(App):
   def build(self):
      w = mywidget()
      return w

circlesapp().run()

Output

正如你可以看到的,圆形在整个应用程序窗口区域的随机位置绘制。

kivy stencial view

现在我们应用 StencilView 并将主窗口中心绘制位置限制为 400×300 像素。

创建 StencilView 对象并向其添加一个 Widget 对象。绘制循环保持不变。

class circlesapp(App):
   def build(self):
      st = StencilView(
         size_hint=(None, None), size=(400, 300),
         pos_hint={'center_x':.5, 'center_y':.5}
      )
      w=widget()
      st.add_widget(w)
      return st

如果我们现在运行应用程序,我们应该能看到随机圆出现于模板区域内,对于其外部所有位置,绘制指令都受到了限制。

kivy stencil area