Kivy - 輸入



Kivy 框架能夠接收和處理來自滑鼠、觸控式螢幕、陀螺儀、加速度計等不同型別的輸入。大多數情況下,Kivy 會自動檢測可用的硬體。但是,如果您想支援自定義硬體,則需要相應地配置 kivy。

不同輸入源生成的事件都由相應的事件類表示。MotionEvent 是用於指向裝置(觸控和非觸控事件)提供的事件的基本類。

  • 觸控事件 - 包含至少 X 和 Y 位置的運動事件。所有觸控事件都分發到 Widget 樹中。

  • 非觸控事件 - 加速度計就是一個非觸控事件的例子,因為它是一個連續的事件,沒有位置。它永遠不會開始或停止。這些事件不會分發到 Widget 樹中。

Kivy 對輸入應用後處理並進行分析,以做出有意義的解釋,例如:

  • 是否為雙擊/三擊檢測?(根據距離和時間閾值)

  • 當硬體不準確時使事件更準確

  • 如果本機觸控硬體傳送的事件位置幾乎相同,則減少生成的事件數量

處理後,運動事件將分發到 Window。如果它只是一個運動事件,它將分發到 on_motion()。另一方面,如果它是觸控事件,觸控的 (x,y) 位置(0-1 範圍)將按比例縮放為 Window 大小(寬度/高度),並分發到:

  • on_touch_down()
  • on_touch_move()
  • on_touch_up()

示例

在下面的示例中,我們定義了一個名為 widget 的新類,它繼承自 Widget。我們需要使用以下語句匯入 Widget 類:

from kivy.uix.widget import Widget

widget 類中有三個方法:

  • on_touch_down - 初始按下。

  • on_touch_move - 在按下並移動過程中發生的移動。

  • on_touch_up - 按下“釋放”。

class widget(Widget):
   def on_touch_down(self, touch):
      print("Down:",touch)
   def on_touch_move(self, touch):
      print("Move:",touch)
   def on_touch_up(self, touch):
      print("UP!",touch)

接下來,App 類的 build() 方法返回 widget() 物件。

class MotionApp(App):
   def build(self):
      return widget()

您可以透過在螢幕上單擊並拖動來測試程式碼。您應該看到滑鼠的所有移動和按壓位置。

以下是完整程式碼。您可以儲存並執行它:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.config import Config

# Configuration
Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', '1')

class widget(Widget):
   def on_touch_down(self, touch):
      print("Down:",touch)
   def on_touch_move(self, touch):
      print("Move:",touch)
   def on_touch_up(self, touch):
      print("UP!",touch)

class MotionApp(App):
   def build(self):
      return widget()

if __name__ == '__main__':
   MotionApp().run()

輸出

輸出是一個空的應用程式視窗,其中沒有任何 UI 元件。

在視窗中的任何位置單擊滑鼠。將捕獲“on_touch_down”和“on_touch_up”事件,顯示滑鼠觸控的位置,如下所示:

Down: <MouseMotionEvent spos=(0.4228094575799722, 0.38596491228070173) pos=(304.0, 154.0)>
UP! <MouseMotionEvent spos=(0.4228094575799722, 0.38596491228070173) pos=(304.0, 154.0)>
Down: <MouseMotionEvent spos=(0.5730180806675939, 0.5137844611528822) pos=(412.0, 205.0)>
UP! <MouseMotionEvent spos=(0.5730180806675939, 0.5137844611528822) pos=(412.0, 205.0)>
Down: <MouseMotionEvent spos=(0.2517385257301808, 0.5588972431077694) pos=(181.0, 223.0)>
UP! <MouseMotionEvent spos=(0.2517385257301808, 0.5588972431077694) pos=(181.0, 223.0)>

MouseMotionEvent 的spos屬性在 0-1 座標系中提供相對位置。應用程式視窗的左下角對應於 (0,0),右上角對應於 (1,1)。

pos屬性顯示滑鼠單擊的實際座標。在上面的示例中,它相對於 (0,0) 位置向右 378.85 畫素,向上 281.39 畫素。

按住滑鼠並將其移動到視窗中,您將獲得 spos 和 pos 屬性的瞬時變化值。例如:

Move: <MouseMotionEvent spos=(0.41863699582753827, 0.5338345864661654) pos=(376.3546592489569, 266.38345864661653)>
Move: <MouseMotionEvent spos=(0.4172461752433936, 0.531328320802005) pos=(375.1043115438108, 265.1328320802005)>
Move: <MouseMotionEvent spos=(0.41585535465924894, 0.5288220551378446) pos=(373.8539638386648, 263.88220551378447)>

事件配置檔案

根據輸入提供程式和正在使用的硬體型別,事件配置檔案包含有關輸入事件的更多資訊。該配置檔案是 MotionEvent 物件的裝置特定屬性。例如,觸控輸入具有 (x,y) 位置,但可能還具有壓力資訊、斑點大小、加速度向量等。

透過在 touch_down 事件處理程式中新增以下語句,我們可以找出當前裝置支援的功能。

def on_touch_down(self, touch):
   print(touch.profile)

輸出將取決於裝置型別。它可能是:

['pos', 'button']

或者,

['pos', 'angle']

配置檔案值

以下是預設支援的一些配置檔案值。

序號 配置檔案值和說明
1 角度

2D 角度。透過“a”屬性訪問。

2 按鈕

滑鼠按鈕('left'、'right'、'middle'、'scrollup' 或 'scrolldown')。透過 button 屬性訪問。

3 標記 ID

標記或基準 ID。透過 fid 屬性訪問。

4 位置

2D 位置。透過 x、y 或 pos 屬性訪問。

5 3D 位置

3D 位置。透過 x、y 或 z 屬性訪問。

6 壓力

接觸壓力。透過 pressure 屬性訪問。

7 形狀

接觸形狀。透過 shape 屬性訪問。

觸控形狀

在 Kivy 中,觸控事件期間的互動區域由術語“觸控形狀”表示。它指的是用於表示螢幕上觸控或觸控事件的幾何形狀。如果觸控有形狀,它將反映在“shape”屬性中。

Kivy 支援不同的觸控形狀,包括橢圓形、矩形、圓形和正方形。

雙擊/三擊

在多點觸控裝置的上下文中,雙擊是在規定的時間和距離內兩次點選的操作。同樣,裝置可以識別“三擊”操作。

事件物件具有“is_double_tap”屬性以及“is_triple_tap”屬性,兩者都計算為 True 或 False。您可以測試當前觸控是否為雙擊之一:

def on_touch_down(self, touch):
   if touch.is_double_tap:
      print('Touch is a double tap!')
      print(' - interval is', touch.double_tap_time)
      print(' - distance between previous is', touch.double_tap_distance)

快速連續按下滑鼠按鈕兩次。您可能會獲得類似於以下所示的結果:

Touch is a double tap!
- interval is 0.17462420463562012
- distance between previous is 0.0
廣告