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
正如你可以看到的,圆形在整个应用程序窗口区域的随机位置绘制。
现在我们应用 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
如果我们现在运行应用程序,我们应该能看到随机圆出现于模板区域内,对于其外部所有位置,绘制指令都受到了限制。