Записывать щелчок мыши при нажатии клавиши и останавливать запись, когда та же клавиша отпускается в python

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

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

Также после отпускания f7 слушатель не останавливается

Вот код

from pynput import mouse, keyboard
from pynput.keyboard import Key, Listener
import pickle

x_pos = []
y_pos = []
both_pos = []
file = open("test.txt", "wb")
file.close()

def on_press(key):

    mouse_listener = mouse.Listener(on_click=on_click)
    if (key==keyboard.Key.f7):
        mouse_listener.start()
        print("done")
def on_release(key):    
    if (key==keyboard.Key.f7):
        mouse_listener.stop()
        print("closing file")
        #file.close()
def on_click(x, y, button, pressed):
    if pressed:
        print ("{0} {1}".format(x,y))
        x_pos.append("{0}".format(x,y))
        y_pos.append("{1}".format(x,y))
        #print (x_pos)
        #print (y_pos)      
        both_pos = x_pos, y_pos
        with open("temp.txt", "ab") as file:
            pickle.dump(both_pos, file)
        print(both_pos)
mouse_listener = mouse.Listener(on_click=on_click)
#mouse_listener.start()
with keyboard.Listener(on_press = on_press, on_release = on_release) as listener:
    try:
        #listener.start()
        listener.join()
    except MyException as e:
        print('Done'.format(e.args[0]))

person Vinay Dandwani    schedule 03.08.2018    source источник
comment
stackoverflow.com/questions/13564851 / Это может быть полезным руководством для нажатия и отпускания клавиш. Я использовал его много.   -  person J0hn    schedule 03.08.2018


Ответы (1)


У вас нет ссылки на один и тот же mouse_listener в on_release и on_press.
Удалите mouse_listener = mouse.Listener(on_click=on_click) из on_press и определите mouse_listener перед обоими on_press и on_release.

mouse_listener = mouse.Listener(on_click=on_click)

def on_press():
    # do on press stuff with mouse_listener
    pass

def on_release():
    # do on release stuff with mouse_listener
    pass 

Также, возможно, стоит обернуть все это в класс

person con--    schedule 03.08.2018