2

我试图制作一个非常简单的程序,F5当我按下另一个键时按下该键(示例q)。每当我使用常规字符 az 我比较使用

if key.char == 'q':

这工作正常,直到我介绍Key.f5(或任何其他Key.

if key.char == 'q':
    keyboard.press(Key.f5)
    keyboard.release(Key.f5)

然后我得到这个错误:

if f(*args) is False:
File "C:\Users\lkl\Desktop\combination-1.py", line 17, in on_release
if key.char == 'q':
AttributeError: 'Key' object has no attribute 'char'

我曾尝试重命名keykey1和其他名称。我试图创建一个名为keyboard1和其他名称的控制器。我试图在它自己的函数中隔离以下代码:

keyboard.press(Key.f5)
keyboard.release(Key.f5)

我试图用 Try except 语句来捕捉错误。错误仍然出现。它结束了执行。

我试图key.char通过简单地将键与字符的 Unicode 和 html 代码进行比较来避免这种情况。按下时不会触发任何操作q

if key == 'U+0071':

问题是,F5即使我使用,程序也会执行命令,key.char但 AttributeError 会停止程序。

我能够做到这一点:

if key == Key.shift_l:
    keyboard.press(Key.f5)
    keyboard.release(Key.f5)

但我需要密钥是一个简单的 az 密钥,因为机器正在通过单独机器上的键盘记录器接收密钥。它只能发送/接收非特殊密钥。例如。数字和字母。

这完全让我的大脑起皱。F5我在收听时找不到单一的发送方式'q'

这是完整的代码:

from pynput.mouse import Listener as ms
from pynput.keyboard import Listener as kb
from pynput.keyboard import Key, Controller
import os
import sys
import subprocess

keyboard = Controller()

def on_press(key):
    print('{0} pressed'.format(
        key))

def on_release(key):
    print('{0} release'.format(
        key))
    if key.char == 'q':
        keyboard.press(Key.f5)
        keyboard.release(Key.f5)
    if key == "a":
        subprocess.call("C:/Users/lkl/Desktop/fastsafelargetest - Copy.vbs", shell=True)
    if key == 'z':
        subprocess.call("C:/Users/lkl/Desktop/autofill.vbs", shell=True)
    if key == Key.esc:
        return False

def on_click(x, y, button, pressed):
    if pressed:
        pass
    else:
        #subprocess.call("C:/Users/lkl/Desktop/fastsafelargetest - Copy.vbs", shell=True)
        print('Released')

def on_scroll(x, y, dx, dy):
    print('Scrolled {0}'.format(
        (x, y)))

# Collect events until released
with ms(
        on_click=on_click,
        on_scroll=on_scroll) as listener:
    with kb(
            on_press=on_press,
            on_release=on_release) as listener:
        listener.join()
4

4 回答 4

2

根据@jim-todd 的回答,我找到了python 模块“键盘”。它不是一个非常优雅的解决方案,但它在技术上为该问题提供了一种解决方法。我使用这一行来检查键输入:

keyboard.is_pressed('q'):

将我的 pynput 控制器重命名为 keyboard1

keyboard1 = Controller()

这个问题的整个代码看起来像这样(这里并不是所有的导入都是必要的)。

from pynput.mouse import Listener as ms
from pynput.keyboard import Listener as kb
from pynput.keyboard import Key, Controller
import keyboard
import os
import sys
import subprocess
import time

keyboard1 = Controller()

def on_press(key):
    while keyboard.is_pressed('q'):
        keyboard1.press(Key.f5)
        keyboard1.release(Key.f5)
        print('{0} pressed'.format(
        key))
        time.sleep(0.05)
        break
    if key == Key.esc:
        return False

with ms() as listener:
    with kb(
            on_press=on_press) as listener:
        listener.join()
于 2018-11-18T11:28:23.577 回答
0

在使用它之前,您将不得不测试关键对象是否有一个字符。

我在我的应用程序中使用 pynput 的一种方法是做这样的事情(改编自您的代码)

def on_release(key):
    print('{0} release'.format(key))
    if hasattr(key, 'char'):
        if key.char == 'q':
            keyboard.press(Key.f5)
            keyboard.release(Key.f5)
        if key == "a":
            subprocess.call("C:/Users/lkl/Desktop/fastsafelargetest - Copy.vbs", shell=True)
        if key == 'z':
            subprocess.call("C:/Users/lkl/Desktop/autofill.vbs", shell=True)
    if key == Key.esc:
        return False

请注意所有使用字符代码的键都在此部分内

如果 hasattr(key, 'char'):

这将避免错误:)

顺便说一句,在pynput 的文档中,他们以不同的方式执行此操作,通过对 AttributeError 进行尝试捕获,但我尽量避免使用那些对性能至关重要的事情,例如在游戏中的每一帧检查键盘。

于 2022-01-15T21:11:10.157 回答
0

您可以对 if 条件使用 keyboard.pressed 函数,如下所示:

if keyboard.pressed('q'):

这会奏效。

于 2018-11-18T09:34:06.980 回答
-2

利用:

try:
    if key.char == 'q':
        keyboard.press(Key.f5)
        keyboard.release(Key.f5)
except AttributeError:
    #do something when a certain key is pressed, using key, not key.char
    pass
于 2020-08-22T09:28:51.607 回答