【问题标题】:How can I pass arguments to pynput listener on_press function?如何将参数传递给 pynput 监听器 on_press 函数?
【发布时间】:2020-01-18 14:08:00
【问题描述】:

我制作了一个最小的pynput 程序,当按下leftright 箭头键时会执行不同的操作。我想把它变成一个可以接受不同值作为参数的函数。

这是一个没有函数且没有参数的最小工作示例:

from pynput.keyboard import Key, Listener 

def on_press(key):
    print('{0} pressed'.format(key))

    if key == Key.esc:
        return False
with Listener(on_press=on_press) as listener:
    listener.join()

它会打印你按下的键,并在你按下esc时退出。

这就是我想要实现的。请注意,它不起作用。只看逻辑。 当按下left 箭头时,我希望程序执行取决于给定参数的命令。右箭头反之亦然。

from pynput.keyboard import Key, Listener

def on_press(key, left, right):
    if key == Key.left:
        print("{}'s key was pressed.".format(left))
    if key == Key.right:
        print("{}'s key was pressed.".format(right))

    if key == Key.esc:
        return False

def activate(name1, name2):
    with Listener(
            on_press=on_press(key, left=name1, right=name2)) as listener:
        listener.join()
        # when pressed, the program should print what on_press() is given as argument 

activate('Mark', 'John')

【问题讨论】:

  • 甚至没有关闭。
  • 怎么不是?将参数“传递”给一个实际上被其他代码调用的函数的方式是使其成为闭包(或绑定方法,特别是如果您有几个不同的函数希望“传递”相同的论点)。
  • 我不明白这个问题/答案,它根本不包含任何解释。我没有什么可做的
  • 公平地说,这个问题是在问一个更难的情况——你希望回调函数是有状态的。但基本思想是一样的:定义一个函数(使用deflambdainside activate 并将其传递(一如既往地不调用它)给Listener

标签: python pynput


【解决方案1】:

有点晚了,但我最近遇到了类似的情况。
您可以使用:

def activate(name1, name2):
    with Listener(on_press=lambda event: on_press(event, left=name1, right=name2)) as listener:
        listener.join()

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多