key.char выдает AttributeError при использовании Key.f5 в Python Pynput - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь создать очень простую программу, которая нажимает клавишу 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'

Я попытался переименовать key в key1 и другие имена.Я попытался создать контроллер с именем 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()

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Основываясь на ответе @ jim-todd, я нашел модуль python "клавиатура". Это не очень элегантное решение, но оно технически обеспечивает решение проблемы. Я использую эту строку для проверки ввода ключа:

keyboard.is_pressed('q'):

переименование моего контроллера pynput на клавиатуру1

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()
0 голосов
/ 18 ноября 2018

Вы можете использовать функцию keyboard.pressed для условия if следующим образом:

if keyboard.pressed('q'):

Это будет работать.

...