iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0
Software Development

實戰 Python x PyQt5 軟體介面設計系列 第 30

( Day 30 ) 偵測鍵盤事件與快速鍵組合

  • 分享至 

  • xImage
  •  

這篇教學會介紹在 PyQt5 的視窗裡,偵測按下哪個鍵盤的按鍵,以及是否按下鍵盤的快速鍵 ( 熱鍵 ) 組合,透過鍵盤按鍵的事件,進行簡單的互動應用。

原文參考:偵測鍵盤事件與快速鍵組合

因為 Google Colab 不支援 PyQt5,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。

PyQt5 教學 - 偵測鍵盤事件與快速鍵組合

偵測按下鍵盤的按鍵

建立 PyQt5 的 Widget 元件之後,可以使用 keyPressEvent 偵測鍵盤按下事件,將事件對應到指定的函式,在函式內使用 key() 方法,就能取得鍵盤按鍵的 keycode,下方的程式碼執行後,會透過 QLabel 印出目前按下的鍵盤 keycode。

from PyQt5 import QtWidgets
import sys

app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)

label = QtWidgets.QLabel(Form)
label.setGeometry(0,0,100,30)

def key(self):
    keycode = self.key()         # 取得該按鍵的 keycode
    label.setText(str(keycode))  # QLabel 印出 keycode

Form.keyPressEvent = key         # 建立按下鍵盤事件,對應到 key 函式

Form.show()
sys.exit(app.exec_())

PyQt5 keycode 對照表

在 PyQt5 裡大部分的 keycode 都與標準 keycode 相同,例如 A~Z、0~9、特殊符號...等,然而像是 Enter、Del 等特殊鍵,則會出現比較不同的數值,下方列出常用按鍵的對照表。

按鍵 keycode 按鍵 keycode 按鍵 keycode
1 49 A 65 delete 16777219
2 50 B 66 enter 16777220
3 51 C 67 shift 16777248
4 52 D 68 up 16777235
5 53 E 69 down 16777237
6 54 F 70 left 16777234
7 55 G 71 right 16777236
8 56 H 72 ctrl 16777250
9 57 I 73 alt 16777251
0 48 J 74 command 16777249
- 45 K 75 space 32
` 96 L 76 -
= 61 M 77 -
[ 91 N 78 -
] 93 O 79 -
|92 P 80 -
; 59 Q 81 -
' 39 R 82 -
, 44 S 83 -
/ 47 T 84 -
. 46 U 85 -
- V 86 -
- W 87 -
- X 88 -
- Y 89 -
- Z 90 -

偵測鍵盤快速鍵組合

如果要偵測鍵盤的快速鍵組合 ( 熱鍵 ),例如 Ctrl+O、Ctrl+C...等,除了自己寫程式判斷,也可以載入 PyQt5.QtGui 的 QKeySequence 模組,搭配 QtWidgets.QShortcut() 方法,就可以偵測快速鍵,使用方法如下:

shortcut = QtWidgets.QShortcut(QKeySequence("快速鍵組合"), Form)
shortcut.activated.connect(fn)
# Form 為主視窗元件
# 快速鍵組合例如 Ctrl+C、Alt+C...等,不可以有空格,不區分大小寫
# fn 為按下快速鍵組合要執行的函式

下方的程式碼執行後,當使用者按下快速鍵組合,就會透過 QLabel 顯示目前的快速鍵組合內容。

from PyQt5 import QtWidgets
from PyQt5.QtGui import QKeySequence
import sys

app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)

label = QtWidgets.QLabel(Form)
label.setGeometry(0,0,100,30)

def ctrl_o():
    label.setText('Ctrl + O')

shortcut = QtWidgets.QShortcut(QKeySequence("Ctrl+O"), Form)  # 偵測 Ctrl + O
shortcut.activated.connect(ctrl_o)

def alt_shift_c():
    label.setText('Alt + Shift + C')

shortcut = QtWidgets.QShortcut(QKeySequence("Alt+Shift+C"), Form)  # 偵測 Alt + Shift + C
shortcut.activated.connect(alt_shift_c)


Form.show()
sys.exit(app.exec_())

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 29 ) 偵測滑鼠事件
下一篇
( Day 31 ) 偵測與控制視窗
系列文
實戰 Python x PyQt5 軟體介面設計35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言