【问题标题】:Please explain the working of following code and some questions mentioned below请解释以下代码的工作原理和下面提到的一些问题
【发布时间】:2020-08-11 23:57:32
【问题描述】:
import keyboard
def fun1(r):
    print(r.name)    
keyboard.on_press(fun1)

代码是一个简单的按键记录器,这里到底发生了什么?

到目前为止我的理解是:

  1. 导入
  2. 函数定义
  3. keyboard.on_press 被调用

请解释以下几点

  1. 究竟是什么keyboard.on_press(fun1) 正在传递给fun1()
  2. 为什么有一个参数对 fun1 很重要
  3. 如果我不想做一个函数只是想把我的代码放在[keyboard.on_press("here")],为什么不可能呢。

还有几个问题

with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()
  1. 这里的“with”语句是怎么回事?
  2. .join() 是什么意思{将它加入主线程意味着什么}
  3. 我们在哪里写了on_press=on_press {为什么不只写一次}

我不知道这个查询是依赖于 python 的版本还是模块的版本。 我正在使用所有最新版本。 到目前为止,我阅读了关于 https://pynput.readthedocs.io/en/latest/keyboard.html 并用谷歌搜索我所有的问题,但找不到简单的解释。

【问题讨论】:

  • 看起来很像家庭作业
  • 请不要,我每次在论坛上提问时都会得到这个。不是家庭作业只是让我的问题在有知识的人看来很简单,这就是为什么它看起来像一个学术问题。

标签: python-3.x python-2.7 keyboard-events keylogger


【解决方案1】:

这里有一些带有 cmets 的代码来帮助解释语法:

import keyboard

def somefunc(msg):
    print(msg)  # here

def fun1(r):  # r is keyboard event
    print(type(r))   #  <class 'keyboard._keyboard_event.KeyboardEvent'>
    print(r.name)   # key text
    somefunc("here")   # call some other function
    
keyboard.on_press(fun1) # pass a reference to the other function (on_press will call whatever function we pass), other function must have single parameter

while True: pass  # keep script running

With 关键字只是确保对象即使出现错误也能正确关闭。

with keyboard.Listener(
        on_press=on_press,   # named parameter is on_press, we are passing a reference to function on_press
        on_release=on_release) as listener:  # named parameter is on_release, we are passing a reference to function on_release
    listener.join()  # wait for listener thread to finish

# Is shortcut syntax for:

listener = keyboard.Listener(on_press=on_press, on_release=on_release)
try:
    ........
finally:
    listener.stop()  # always do this, even if error
listener.join()

关于双变量。看起来很奇怪,我知道。代码使用命名参数。

# sample function
def myfunc(x):   # the parameter name is x
    print(x)
    
# We can call myfunc several ways:
myfunc(1)  # pass value directly
myfunc(x=1)  # specify parameter to assign

x=1  # local variable
myfunc(x)  # pass the local variable as parameter
myfunc(x=x)  # specify parameter to assign, pass local variable # this is the double text you're seeing  

关于回调函数,您可以将函数引用传递给另一个函数。

def MyCallback(a,b):  # custom function
    print(a,b) 
    
def SomeEventHandler(f): # parameter is reference to another function 
    f(1,2)  # call passed in function, it must have these parameters
    
SomeEventHandler(MyCallback)  # pass custom function to handler

我希望这能把事情弄清楚一点。

【讨论】:

  • fun1(r) 如何知道“r”是键盘事件? (如果在定义时我没有提供任何参数,则会出现错误)并且有没有办法让它在没有函数的情况下工作?
  • 出于某种原因“while True: pass # keep script running”不是必需的,为什么?为什么它在没有while循环的情况下继续运行?
  • 我用函数参考示例更新了答案。至于 while 循环,我需要它来进行测试。您的程序中可能不需要它。
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
相关资源
最近更新 更多