События Python mouse.Listener и keyboard.Listener запускаются дважды

Я хочу собирать данные во время игры, чтобы я мог изучить алгоритм, чтобы играть в нее позже. Для этого мне нужен регистратор клавиш и мыши, этот регистратор должен:

  • регистрировать щелчки мыши и прокрутки
  • регистрировать любые нажатия клавиш.

Проблема, с которой я сталкиваюсь, заключается в том, что один щелчок/прокрутка мыши и нажатие клавиши регистрируются дважды. Я думал, что с помощью Javascript вы можете остановить это, используя preventDefault(), но я не знаю решения этой проблемы на Python.

Следующие выходные строки представляют собой один клик:

время/кнопка/x/y/нажато
(17:52:08.509538): click:Button.left:587:1266:True:
(17:52:08.510471): click:Button.left :587:1266:Верно:

Я бы предпочел не проверять разницу во времени между текущим и последним триггером, за исключением случаев, когда у меня нет другого варианта, но я не могу представить, что это так.

Я определил своих слушателей следующим образом:

with keyboard.Listener(on_press=self.on_press) as k_listener, mouse.Listener(on_click=self.on_click, on_scroll=self.on_scroll) as m_listener:
        k_listener.join()
        m_listener.join()

Методы on_press, on_click и on_scroll выглядят следующим образом:

def on_press(self, key):
    print(str(key))
    self.log_input(str(key))

def on_click(self, x, y, button, pressed):
    if pressed:
        print('click:' + str(button) + ':' + str(x) + ':' + str(y) + ':' + str(pressed) + ':')
        self.log_input('click:' + str(button) + ':' + str(x) + ':' + str(y) + ':' + str(pressed) + ':')
    else:
        pass

def on_scroll(self, x, y, dx, dy):
    print('scroll:' + str(x) + ':' + str(y) + ':' + str(dx) + ':' + str(dy) + ':')
    self.log_input('scroll:' + str(x) + ':' + str(y) + ':' + str(dx) + ':' + str(dy) + ':')  

Я хотел бы, чтобы эти методы запускались только один раз, а не дважды.


person aaron    schedule 03.10.2020    source источник
comment
Некоторые пользовательские интерфейсы рассматривают on_click как объединенную версию on_click_down + on_click_up в той же позиции, похоже, что он вызывает двойной щелчок вместо on_drag (x/y может быть одинаковым, но он может содержать двойное значение и не показывать десятичные знаки)   -  person Alex    schedule 28.01.2021


Ответы (1)


Я не могу воспроизвести вашу проблему, но она может быть вызвана вашим log_input. Я бы предложил регистрировать ваши входные данные через отдельно определенную функцию, которая могла бы добавляться к списку или текстовому файлу. Вот упрощенная версия, использующая только событие нажатия клавиши.

def log_input(input):
    global Log
    Log.append(input)

def on_press(key):
    print(str(key))
    log_input(str(key))

Использование отдельного метода работает в моих собственных программах.

person Dylan Kirby    schedule 28.01.2021