4

Im using pynput listener to catch key presses from keyboard, but the problem is that i need to pass parameter to the on_press and on_release functions and i just can't figure out how to do it. you can see in the code, i need to pass the client socket so i could send him the key that was pressed/released.

def handle_keyboard_events(self, client_socket):
    keyboard_listener = keyboard.Listener(on_press=self.on_key_press, on_release=self.on_key_release)
    keyboard_listener.start()

def on_key_press(self, key):
    key_press_command = KeyPress(key)
    self.send_message(key_press_command, True, client_socket)

def on_key_release(self, key):
    key_release_command = KeyRelease(key)
    self.send_message(key_release_command, True, client_socket)

1 Answers1

0

i see you are using self so you are inside a class.

why dont you use self.client_socket = client_socket in your constructor?

# update your constructor with self.client_socket
def __init__(client_socket, **other_args_of_yours):
    
    # use this object variable when you activate key listener
    self.client_socket = client_socket

or add self.client_socket = client_socket in handle_keyboard_events() method:

def handle_keyboard_events(self, client_socket):
    
    self.client_socket = client_socket # <----- update
    
    keyboard_listener = keyboard.Listener(
        on_press=self.on_key_press, 
        on_release=self.on_key_release
    )
    keyboard_listener.start()

and use self.client_socket in press and release methods

def on_key_press(self, key):
    key_press_command = KeyPress(key)
    self.send_message(key_press_command, True, self.client_socket) # <--- update

def on_key_release(self, key):
    key_release_command = KeyRelease(key)
    self.send_message(key_release_command, True, self.client_socket) # <--- update

OR

if you really want to pass client_socket to your press and release methods, you can try this:

def handle_keyboard_events(self, client_socket):
    # use lambda to pass the client socket
    # with this method, after you get the `key` you can pass additional params to on_press and on_release
    keyboard_listener = keyboard.Listener(
        on_press=lambda key: self.on_key_press(key, client_socket), # <--- client socket passed
        on_release=lambda key: self.on_key_release(key, client_socket) # <--- client socket passed
    )
    keyboard_listener.start()

# add client socket as new arg
def on_key_press(self, key, client_socket):
    key_press_command = KeyPress(key)
    self.send_message(key_press_command, True, client_socket) # from params
    
# add client socket as new arg
def on_key_release(self, key, client_socket):
    key_release_command = KeyRelease(key)
    self.send_message(key_release_command, True, client_socket) # from params

and you are ready to go.

alexzander
  • 1,586
  • 1
  • 9
  • 21