Kivy - 線



在 Kivy 庫中,“Line” 是“kivy.graphics”模組中一個重要的頂點指令。在 Kivy 中,所有繪圖都在與任何可用小部件關聯的畫布上完成。Line 指令繪製一條線,或一系列線,以及其他形狀,如矩形、橢圓、貝塞爾曲線等。

必須注意,Kivy 繪圖指令不會自動相對於小部件的位置或大小。相反,所有小部件的畫布共享一個公共座標空間。

Line 函式需要一個數值列表。數字的解釋取決於將此列表分配到的引數。List 函式的引數是點、矩形、橢圓、貝塞爾曲線等。

繪製矩形

語法

可以使用以下語法,透過 Line 函式繪製矩形:

with self.canvas:
   Line(rectangle=[x, y, w, h], width)

這裡,“x” 和“y”表示矩形的左下角位置,“w” 和“h”表示寬度和高度。線條會自動閉合。

還可以使用 rounded_rectangle 屬性來構建具有圓角的矩形。引數必須是以下格式之一的元組:

  • (x, y, width, height, corner_radius)

  • (x, y, width, height, corner_radius, resolution)

  • (x, y, width, height, corner_radius1, corner_radius2, corner_radius3, corner_radius4)

  • (x, y, width, height, corner_radius1, corner_radius2, corner_radius3, corner_radius4, resolution)

示例

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

Window.size = (720,300)

class drawRectangle(App):
   def build(self):
      widget = Widget()
      with widget.canvas:
         Color(1, 0, 1, 1)
         Line(
            rectangle=(50, 50, 300, 200),
            width=3
         )
         Line(rounded_rectangle=(500, 200, 300, 200, 20, 20, 20, 20))
      return widget
drawRectangle().run()

輸出

它將生成以下輸出視窗:

Kivy Line

繪製橢圓

需要將數值列表分配給 Line 指令的 ellipse 屬性。ellipse 引數的值必須是以下元組:

(x, y, width, height, angle_start, angle_end, segments)

其中,

  • "x" 和 "y" 表示橢圓的左下角

  • "width" 和 "height" 表示橢圓的大小。如果這兩個值相同,結果將是一個圓形

  • "angle_start" 和 "angle_end" 以度為單位。預設值為 0 和 360。

  • "segments" 是橢圓的精度。可以使用此屬性建立具有 3 個或更多邊的多邊形。小於 3 的值將不會顯示。

示例

在下面的程式碼中,Line 指令用於使用不同的引數繪製橢圓:

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

Window.size = (720,400)

class drawEllipse(App):
   def build(self):
      widget = Widget()

      with widget.canvas:
         Color(0.5, .2, 0.4, 1)
         Line(ellipse=(500, 70, 200, 200), width=4)
         Line(ellipse=(100, 200, 100, 200), width=4)
         Color(.2, .8, 0, 1)
         Line(ellipse=(200, 100, 200, 100), width=4)
         Line(ellipse=(500, 300, 250, 90, 45, 270), width=3)

         Color(.1, .8, .3, 1)
         Line(ellipse=(200, 400, 200, 80, 180, 420, 30), width=5)

      return widget

drawEllipse().run()

輸出

Kivy Line Ellipse

繪製貝塞爾曲線

貝塞爾曲線由一些控制點加權,這些控制點包含在指令中。Line() 函式接受 Bezier 引數,並將 (x,y) 座標對列表傳遞給它。引數必須是 2n 個元素的列表,“n”是點的數量。

with self.canvas:
   Line(bezier=[x1, y1, x2, y2, x5, y3], width)

需要注意的是,Line 指令函式的 points 引數也接收類似的 2n 個元素集。points 屬性在連續點之間繪製一條線。

with self.canvas:
   Line(points=[x1, y1, x2, y2, x5, y3], width)

Line 指令的 point 引數僅繪製每個 x-y 座標對對應的點,而沒有任何連線它們的線。

with self.canvas:
   Line(point=[x1, y1, x2, y2, x5, y3], width)

示例

以下程式碼使用相同的“x”和座標對集來僅繪製點、線和貝塞爾線:

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

Window.size = (720, 400)

class drawBezier(App):
   def build(self):
      widget = Widget()
      
      with widget.canvas:
         Color(0, 1, 1, 1)
         Bezier(
            points=[700, 400, 450, 300, 300, 350, 350, 200, 200, 100, 150, 10],
            segments=20
         )
         Color(1, 1, 0, 1)
         Point(
            points=[700, 400, 450, 300, 300, 350, 350, 200, 200, 100, 150, 10],
            pointsize=5
         )

         Color(.1, .1, .8)
         Line(
            points=[700, 400, 450, 300, 300, 350, 350, 200, 200, 100, 150, 10],
            pointsize=3
         )
      return widget
      
drawBezier().run()

輸出

執行此程式碼時,它將生成如下所示的輸出視窗:

Kivy Draw Bezier Curve

需要注意的是,Kivy 提供了另一組頂點指令來使用 Rectangle、Ellipse、Bezier 指令繪製這些形狀。這些與 Line 指令的 rectangle、ellipse 和 bezier 引數不同。

注意指令本身和引數的首字母大寫(Ellipse 指令與 Line 指令的 ellipse 引數)。Line 函式繪製形狀而不重新計算點。

廣告