将参数传递给 pynput 侦听器

Posted

技术标签:

【中文标题】将参数传递给 pynput 侦听器【英文标题】:Passing arguments to a pynput listener 【发布时间】:2019-03-29 02:19:18 【问题描述】:

我正在使用 pynput 侦听器来捕获键盘上的按键,但问题是我需要将参数传递给 on_press 和 on_release 函数,我只是不知道该怎么做。 您可以在代码中看到,我需要传递客户端套接字,以便我可以将按下/释放的键发送给他。

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】:

我看到你正在使用self,所以你在class中。

为什么不在构造函数中使用self.client_socket = client_socket

# 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

或在handle_keyboard_events()方法中添加self.client_socket = client_socket

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()

并在pressrelease 方法中使用self.client_socket

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

如果你真的想将client_socket 传递给你的pressrelease 方法,你可以试试这个:

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

你准备好了。

【讨论】:

以上是关于将参数传递给 pynput 侦听器的主要内容,如果未能解决你的问题,请参考以下文章

Ext Js 如何将参数传递给服务器代码

如何将相同的事件侦听器分配给 Vue.js 中动态创建的按钮并将对象的值作为参数传递给它?

如何将参数传递给 addEventListener 监听器函数?

以简单的方式将参数传递给 AS3 中的事件侦听器......它存在吗?

如何将令牌存储作为参数传递给 Symfony 3.4 中的事件监听器

如何将侦听器代码从闭包移到方法并在ZF2中将参数传递给它?