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
廣告