Как нажать горячую клавишу и открыть конкретный URL в Python? - PullRequest
0 голосов
/ 24 апреля 2019

Нажмите последовательность кнопок, например shift + a и откройте amazon.com.Нажмите другую последовательность кнопок, например shift + e и откройте ebay.com.Код работает для amazon.com, но когда я нажимаю горячую клавишу shift + e , он не открывается на ebay.com.Когда вы печатаете клавишу, которую нажимаете, вы понимаете, что программа нажимает Shift , e и a .Я не знаю, почему программа печатает a , который я не нажимаю?

import time
from pynput import keyboard
COMBINATIONS = [
    {keyboard.Key.shift, keyboard.KeyCode(char='a')},
    {keyboard.Key.shift, keyboard.KeyCode(char='A')},
    {keyboard.Key.shift, keyboard.KeyCode(char='e')},
    {keyboard.Key.shift, keyboard.KeyCode(char='E')}
]
current = set()

def execute(url):
    keyboard_ctrl = keyboard.Controller()
    keyboard_ctrl.press(keyboard.Key.ctrl_l)
    keyboard_ctrl.press('l')
    keyboard_ctrl.release(keyboard.Key.ctrl_l)
    keyboard_ctrl.release('l')
    time.sleep(0.2)

    for i in url:
        keyboard_ctrl.press(i)
        keyboard_ctrl.release(i)
    # keyboard_ctrl.type(url)
    time.sleep(0.2)
    keyboard_ctrl.press(keyboard.Key.enter)
    keyboard_ctrl.release(keyboard.Key.enter)

def on_press(key):
    if any([key in COMBO for COMBO in COMBINATIONS]):
        current.add(key)
        print(key)
        if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
            if keyboard.KeyCode(char='a') in current and keyboard.Key.shift in current:
                execute('https://www.amazon.com/')
            if keyboard.KeyCode(char='e') in current and keyboard.Key.shift in current:
                execute('https://www.ebay.com/')

def on_release(key):
    if any([key in COMBO for COMBO in COMBINATIONS]):
        if key in current:
            current.remove(key)

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

1 Ответ

0 голосов
/ 28 апреля 2019

Во-первых, было бы лучше и проще очистить current после комбинации вместо удаления элемента после отпускания ключа. Второй all(k in current for k in COMBO) будет проверять только то, что все элементы в COMBO существуют в current, а не ориентацию. Например, если вы нажмете a + Shift , оно станет True, что здесь не так. Решение состоит в том, чтобы использовать list вместо set и проверить, существует ли COMBO (в виде среза) в current. Я использовал этот пример для проверки существования списка слайсов.

import time
from pynput import keyboard
COMBINATIONS = [
    [keyboard.Key.shift, keyboard.KeyCode(char='a')],
    [keyboard.Key.shift, keyboard.KeyCode(char='A')],
    [keyboard.Key.shift, keyboard.KeyCode(char='e')],
    [keyboard.Key.shift, keyboard.KeyCode(char='E')]
]
current = []


def execute(url):
    keyboard_ctrl = keyboard.Controller()
    keyboard_ctrl.press(keyboard.Key.ctrl_l)
    keyboard_ctrl.press('l')
    keyboard_ctrl.release(keyboard.Key.ctrl_l)
    keyboard_ctrl.release('l')
    time.sleep(0.2)

    for i in url:
        keyboard_ctrl.press(i)
        keyboard_ctrl.release(i)
    # keyboard_ctrl.type(url)
    time.sleep(0.2)
    keyboard_ctrl.press(keyboard.Key.enter)
    keyboard_ctrl.release(keyboard.Key.enter)


def contains_sublist(lst, sublst):
    n = len(sublst)
    return any((sublst == lst[i:i+n]) for i in range(len(lst)-n+1))


def on_press(key):
    global current
    if any([key in COMBO for COMBO in COMBINATIONS]):
        current.append(key)
        print(key)
        if any((contains_sublist(current, COMBO)) for COMBO in COMBINATIONS):
            print("Combination pressed!")
            if current[-1] == keyboard.KeyCode(char='a'):
                execute('https://www.amazon.com/')
            if current[-1] == keyboard.KeyCode(char='e'):
                execute('https://www.ebay.com/')
            current = []


with keyboard.Listener(on_press=on_press) as listener:
    listener.join()
...