Kivy - 模板视图



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

StencilView 组件内部使用了模板图形指令。它提供了一种高效的方式来裁剪子组件的绘图区域。

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

from kivy.uix.stencilview import StencilView

需要注意的是,StencilView 不是布局。因此,要向 StencilView 添加组件,必须组合使用 StencilView 和布局才能实现布局的行为。此外,不能向 StencilView 添加超过 128 个支持模板的组件。

StencilView 的一般用法如下:

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

为了理解 StencilView 如何精确地限制组件的可绘制区域,让我们首先执行某些图形绘制指令,然后使用 StencilView 来查看区别。

示例

在下面的代码中,mywidget 类扩展了 Widget 类,并在随机位置和随机 RGB 值下绘制 200 个圆圈。(这还没有使用 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()

输出

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

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
广告
© . All rights reserved.