問題描述
我正在編寫一個腳本,它會截取屏幕截圖并解碼以圖像名稱命名的特定按鍵,如下所示.我的問題是,當我按下左鍵盤箭頭時,也按下了數字 4.我在谷歌或鍵盤庫的文檔中找不到任何東西.我正在使用 Windows 和 Python 3.6.5
I was writing a script, which takes a screenshot and decodes specific key presses in the name of the image as seen below. My problem is that when I press the left keyboard arrow, also the number 4 is pressed. I can't find anything on google or in the documentation of the keyboard library. I am using Windows and Python 3.6.5
(75,)
left arrow pressed
(5, 75)
4 pressed
向下箭頭也會發生同樣的事情,但數字 3 是這樣的.
The same thing happens with the down arrow, but with the number 3.
(80,)
down arrow pressed
(3, 80)
2 pressed
代碼:
from PIL import ImageGrab
import keyboard # using module keyboard
import time
keys = [
"down arrow",
"up arrow",
"left arrow",
"right arrow",
"w",
"s",
"a",
"d",
"1",
"2",
"3",
"4",
"q",
e",f"]
if __name__ == "__main__":
while True:
code = []
try:
for key in keys:
if keyboard.is_pressed(key):
print(keyboard.key_to_scan_codes(key))
print(f"{key} pressed")
code.append(1)
else:
code.append(0)
if keyboard.is_pressed('esc'):
print(key + " pressed")
break
c = "".join(map(str, code))
snapshot = ImageGrab.grab()
save_path = str(int(time.time()*1000)) + "-" + c + ".jpg"
snapshot.save("tmp\" + save_path)
except:
break
推薦答案
keyboard
模塊對于此類實例有簡單的解決方案,它們使用 event-triggered
激活而不是polling
在您的嘗試中使用.
The keyboard
module has simple solutions for instances like these, they use event-triggered
activation rather than polling
as is used in your attempt.
示例代碼:
import keyboard
def handleLeftKey(e):
if keyboard.is_pressed("4"):
print("left arrow was pressed w/ key 4")
# work your magic
keyboard.on_press_key("left", handleLeftKey)
# self-explanitory: when the left key is pressed down then do something
keyboard.on_release_key("left", handleLeftKey02)
# also self-explanitory: when the left key is released then do something
# don't use both ...on_release & ...on_press or it will be
# triggered twice per key-use (1 up, 1 down)
替換下面的代碼并根據您的需要進行更改.
Replace the code below and change it to suit your needs.
if __name__ == "__main__":
while True:
code = []
try:
for key in keys:
if keyboard.is_pressed(key):
print(keyboard.key_to_scan_codes(key))
print(f"{key} pressed")
code.append(1)
else:
code.append(0)
另一種更動態的方法如下所示:
Another, more dynamic approach would look like:
import keyboard
keys = [
"down",
"up",
"left",
"right",
"w",
"s",
"a",
"d",
"1",
"2",
"3",
"4",
"q",
"e",
"f"
]
def kbdCallback(e):
found = False
for key in keys:
if key == keyboard.normalize_name(e.name):
print(f"{key} was pressed")
found = True
# work your magic
if found == True:
if e.name == "left":
if keyboard.is_pressed("4"):
print("4 & left arrow were pressed together!")
# work your magic
keyboard.on_press(kbdCallback)
# same as keyboard.on_press_key, but it does this for EVERY key
我注意到的另一個問題是您使用 "left arrow"
而實際上它被識別為 "left"
(至少在我的系統上,它可能會有所不同在你的,但我假設你希望它在所有系統上工作,所以使用 "left"
會更安全)
Another issue I noticed was that you were using "left arrow"
when really it was recognized as "left"
(at least on my system, it may be different on yours, but I assume you want it to work on all systems so it'd be safer using "left"
instead)
您可以使用的最后一種方法是非常靜態類型的并且沒有動態功能,但可以在 "4+left"
或 "left+4"
The last method you could use is very statically typed and has no dynamic capabilities, but would work in the case of "4+left"
or "left+4"
import keyboard
def left4trigger:
print("the keys were pressed")
keyboard.add_hotkey("4+left", left4trigger)
# works as 4+left or left+4 (all of the examples do)
你看起來很聰明,可以從那里弄清楚其余的事情.
You seem smart enough to figure out the rest from there.
這篇關于Python鍵盤庫方向鍵問題的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!