Kivy - StencilView 小部件
Kivy 库中的 StencilView 小部件限制了添加到其中的其他子小部件的画布区域。任何试图在模板视图区域外绘制的指令都将被剪裁。
Stencil 图形指令由 StencilView 小部件在后台使用。它提供了一种高效的方式来剪裁子项的绘图区域。
StencilView 类在"kivy.uix.stencilview"模块中定义。
from kivy.uix.stencilview import StencilView
可能需要注意的是,StencilView 不是布局。因此,要将小部件添加到 StencilView,您必须结合 StencilView 和 Layout 才能实现布局的行为。此外,您不能向 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()
输出
如您所见,圆圈绘制在应用程序窗口区域的随机位置。
现在我们将应用 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
如果我们现在运行该应用程序,我们应该会看到模板区域内出现随机圆圈,对于其外部的所有位置,绘图指令都受到限制。