這篇教學會介紹在 PyQt5 的視窗裡,偵測按下哪個鍵盤的按鍵,以及是否按下鍵盤的快速鍵 ( 熱鍵 ) 組合,透過鍵盤按鍵的事件,進行簡單的互動應用。
原文參考:偵測鍵盤事件與快速鍵組合
因為 Google Colab 不支援 PyQt5,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
建立 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 都與標準 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_())
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^