
- Kivy 教程
- Kivy - 首頁
- Kivy 基礎
- Kivy - 入門
- Kivy - 安裝
- Kivy - 架構
- Kivy - 檔案語法
- Kivy - 應用
- Kivy - Hello World
- Kivy - 應用生命週期
- Kivy - 事件
- Kivy - 屬性
- Kivy - 輸入
- Kivy - 行為
- Kivy 按鈕
- Kivy - 按鈕
- Kivy - 按鈕事件
- Kivy - 按鈕顏色
- Kivy - 按鈕大小
- Kivy - 按鈕位置
- Kivy - 圓形按鈕
- Kivy - 停用按鈕
- Kivy - 圖片按鈕
- Kivy 元件
- Kivy - 元件
- Kivy - 標籤
- Kivy - 文字輸入
- Kivy - 畫布
- Kivy - 線
- Kivy - 複選框
- Kivy - 下拉列表
- Kivy - 視窗
- Kivy - 滾動檢視
- Kivy - 走馬燈
- Kivy - 滑塊
- Kivy - 圖片
- Kivy - 彈出視窗
- Kivy - 開關
- Kivy - 微調器
- Kivy - 分隔器
- Kivy - 進度條
- Kivy - 氣泡
- Kivy - 標籤頁面板
- Kivy - 散點圖
- Kivy - 手風琴
- Kivy - 檔案選擇器
- Kivy - 顏色選擇器
- Kivy - 程式碼輸入
- Kivy - 模態檢視
- Kivy - 切換按鈕
- Kivy - 攝像頭
- Kivy - 樹形檢視
- Kivy - reStructuredText
- Kivy - 操作欄
- Kivy - 播放器
- Kivy - 模板檢視
- Kivy - 虛擬鍵盤
- Kivy - 觸控漣漪
- Kivy - 音訊
- Kivy - 影片
- Kivy - 拼寫檢查
- Kivy - 效果
- Kivy - 輸入錄製器
- Kivy - OpenGL
- Kivy - 文字
- Kivy - 文字標記
- Kivy - 設定
- Kivy 佈局
- Kivy - 佈局
- Kivy - 浮動佈局
- Kivy - 網格佈局
- Kivy - 箱式佈局
- Kivy - 堆疊佈局
- Kivy - 錨點佈局
- Kivy - 相對佈局
- Kivy - 頁面佈局
- Kivy - 回收佈局
- Kivy - 佈局巢狀
- Kivy 高階概念
- Kivy - 配置物件
- Kivy - 圖集
- Kivy - 資料載入器
- Kivy - 快取管理器
- Kivy - 控制檯
- Kivy - 動畫
- Kivy - 多筆畫
- Kivy - 時鐘
- Kivy - SVG
- Kivy - UrlRequest
- Kivy - 剪貼簿
- Kivy - 工廠
- Kivy - 手勢
- Kivy - 語言
- Kivy - 圖形
- Kivy - 繪製
- Kivy - 打包
- Kivy - Garden
- Kivy - 儲存
- Kivy - 向量
- Kivy - 工具
- Kivy - 檢查器
- Kivy - 工具
- Kivy - 日誌記錄器
- Kivy - 幀緩衝區
- Kivy 應用和專案
- Kivy - 繪圖應用
- Kivy - 計算器應用
- Kivy - 計時器應用
- Kivy - 攝像頭處理
- Kivy - 圖片檢視器
- Kivy - 貝塞爾曲線
- Kivy - 畫布壓力測試
- Kivy - 圓形繪製
- Kivy - 元件動畫
- Kivy - 其他
- Kivy 有用資源
- Kivy - 快速指南
- Kivy - 有用資源
- Kivy - 討論
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