Я использую библиотеку pynput для отслеживания щелчков мыши. Единственная проблема, с которой я сталкиваюсь, заключается в том, что терминал не завершает работу при нажатии Ctrl + C. Мне нужно использовать клавиатуру слушателя с мышью слушателя. Вот мой код:

import os
import time
import re
from pynput import mouse
from pynput.keyboard import Key, Listener
f=open('maniac1.txt','a')

inc=1
f.write('<mouse_new>\n')

def on_click(x, y, button, pressed):
    f=open('maniac1.txt','a')
    if button == mouse.Button.left:
        print 'Left'
        f.write('left\n')

    if button == mouse.Button.right:
        print 'right'
        f.write('right\n')
    if button == mouse.Button.middle:
        print 'middle'
        f.write('middle\n')

with mouse.Listener(on_click=on_click,on_scroll=on_scroll) as listener:
    try:
        listener.join()
    except MyException as e:
        print('Done'.format(e.args[0]))

Как я могу завершить этот код после нажатия Esc или Ctrl + C? Я использую OSX.

1
Mark Kewton 31 Авг 2017 в 07:53

3 ответа

Лучший ответ

Создайте экземпляр keyboard.Listener без ключевого слова «with», чтобы вы могли запускать и останавливать прослушиватель на основе прослушивателя мыши. Проверьте код ниже, который прекратит слушать нажатие клавиши f8 после щелчка правой кнопкой мыши.

import os
import time
import re
from pynput import mouse
from pynput.keyboard import Key, Listener
#f=open('maniac1.txt','a')

inc=1
#f.write('<mouse_new>\n')
from pynput import keyboard

def on_functionf8(key):
    if (key==keyboard.Key.f8):
        print('f8 is pressed')


key_listener = keyboard.Listener(on_release=on_functionf8)
key_listener.start()


def on_click(x, y, button, pressed):
    f=open('maniac1.txt','a')
    if button == mouse.Button.left:
        print ('Left')
        #f.write('left\n')

    if button == mouse.Button.right:
        key_listener.stop()
        print ('right')
        #f.write('right\n')
    if button == mouse.Button.middle:
        print ('middle')
        #f.write('middle\n')

with mouse.Listener(on_click=on_click) as listener:
    try:
        listener.join()
    except MyException as e:
        print('Done'.format(e.args[0]))

Запустите программу и нажмите f8, и вы увидите «f8 нажата» на терминале. Но щелкните правой кнопкой мыши и нажмите f8. Вы не увидите ничего напечатанного, когда мы остановили слушателя клавиатуры при щелчке правой кнопкой мыши.

Для Mac:

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))



key_listener = keyboard.Listener(on_release=on_press)

Только несколько клавиш, таких как cmd, alt, по умолчанию прослушиваются на Mac.

5
Prakash Palnati 1 Сен 2017 в 11:41

Этот код использует мышь и клавиатуру слушателей вместе.

from pynput.keyboard import Listener  as KeyboardListener
from pynput.mouse    import Listener  as MouseListener
from pynput.keyboard import Key
import logging

logging.basicConfig(filename=("log.txt"), level=logging.DEBUG, format='%(asctime)s: %(message)s')

def end_rec(key):
    logging.info(str(key))

def on_press(key):
    logging.info(str(key))

def on_move(x, y):
    logging.info("Mouse moved to ({0}, {1})".format(x, y))

def on_click(x, y, button, pressed):
    if pressed:
        logging.info('Mouse clicked at ({0}, {1}) with {2}'.format(x, y, button))

def on_scroll(x, y, dx, dy):
    logging.info('Mouse scrolled at ({0}, {1})({2}, {3})'.format(x, y, dx, dy))


with MouseListener(on_click=on_click, on_scroll=on_scroll) as listener:
    with KeyboardListener(on_press=on_press) as listener:
        listener.join()
1
0rk 11 Мар 2019 в 19:08

Я только что закончил то же самое несколько часов назад, вот что я написал.

Сначала добавьте еще один слушатель клавиатуры:

# Collect events until released
    with keyboard.Listener(on_release=on_release) as k_listener, \
            mouse.Listener(on_click=on_click) as m_listener:
        k_listener.join()
        m_listener.join()

Затем добавьте функцию on_release:

def on_release(key):
    if key == keyboard.Key.esc:
        # Stop listeners
        m_listener.stop()
        return False

Тогда, если вы нажмете Esc, этот код будет прерван.

Для OSX вам нужно запустить python с sudo, иначе он не будет работать нормально.

0
wowo878787 6 Дек 2019 в 15:34