我如何用python创建一个键盘侦听器,它将返回按下的键的字符?

2024-06-06 10:02:13 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,当按下“f”键时,函数将返回字符“f”,这样我就可以运行ord(键)并获得按下键的ascii值。我正在尝试制作一个模拟Enigma密码机的程序,希望在窗口对焦时直接从键盘输入,密码输出打印到控制台上。(在一个单独但相关的注释中,我很难记住如何让print()函数在输出后省略换行符)。在我看来,pynput键盘模块是实现这一点的工具,但我不太清楚如何使用它。 这是我目前为止的完整代码。“on_press”和“on_release”功能,以及“with Listener(…)”之后的所有功能都是从互联网上获取的(https://pythonhosted.org/pynput/keyboard.html),老实说,我不知道它们做什么或如何使用它们

from pynput.keyboard import Key, Listener

wheels = {fst:[19,-1 , 4 , -2, 11,-3 , 12,-4 , 8 ,-5 , 10,-6 , 9 , 0 , 11,-8 , 8 ,-9 , 5 ,-10, 2 ,-10,-5 ,-13,-10,-13],
          med:[2 , 6 , 10, 5 , 0 , 15, 12,-6 , 13, 2 ,-10, 11,-3 ,-7 , 0 , 8 ,-13,-1 ,-5 ,-9 ,-15, 4 ,-3 ,-8 ,-7 ,-1 ],
          slo:[16, 17, 19, 16,-3 ,-2 , 4 , 17, 6 , 0 ,-8 ,-3 , 13,-9 ,-7 ,-10,-16,-6 ,-5 ,-4 , 3 ,-4 ,-2 ,-1 ,-18,-13],
          rfl:[8 , 22, 18, 4 , 1 ,-1 , 19,-4 ,-8 , 5 , 2 , 8 ,-2 , 3 ,-5 , 7 ,-3 , 1 ,-1 ,-8 ,-18, 3 ,-7 ,-22,-3 ,-19]}
dials = [0, 0, 0, 0]

def incr():
  dials[0] = (dials[0] + 1) % 26
  if(dials[0]==0):
    dials[1] = (dials[1] + 1) % 26
  if(dials[1]==0):
    dials[2] = (dials[2] + 1) % 26

def shift(char,level):
  return(chr(ord(char) - 97 + wheels[level][(ord(char) - 97 + dials[level]) % 26]))
  
def on_press(key):
  print('{0} pressed'.format(key))

def on_release(key):
  print('{0} release'.format(key))
  if key == Key.esc:
    return False

def route(char):
  #process the character through each level of scrambling
  incr()

with Listener(on_press=on_press, on_release=on_release) as listener:
  listener.join() 

Tags: key函数功能releaseifondeflevel
1条回答
网友
1楼 · 发布于 2024-06-06 10:02:13

听众的一般精神是,他们会“听”你键盘上输入的任何键

在上面的代码中(取自网站),按下某个键时会调用on_press函数,这与释放键不同。此功能非常有用,因为我们可以尝试存储为以后使用而按下的信息(按键)(用于您的Enigma cypher机器)

on_release函数可以被认为是帮助确定侦听器是否应该停止监听键盘的函数。如果on_release函数返回False,则侦听器结束

为了你的项目,我对上面的代码做了一些简陋的修改,这将帮助你不再听键盘

from pynput.keyboard import Key, Listener

wheels = {'fst':[19,-1 , 4 , -2, 11,-3 , 12,-4 , 8 ,-5 , 10,-6 , 9 , 0 , 11,-8 , 8 ,-9 , 5 ,-10, 2 ,-10,-5 ,-13,-10,-13],
          'med':[2 , 6 , 10, 5 , 0 , 15, 12,-6 , 13, 2 ,-10, 11,-3 ,-7 , 0 , 8 ,-13,-1 ,-5 ,-9 ,-15, 4 ,-3 ,-8 ,-7 ,-1 ],
          'slo':[16, 17, 19, 16,-3 ,-2 , 4 , 17, 6 , 0 ,-8 ,-3 , 13,-9 ,-7 ,-10,-16,-6 ,-5 ,-4 , 3 ,-4 ,-2 ,-1 ,-18,-13],
          'rfl':[8 , 22, 18, 4 , 1 ,-1 , 19,-4 ,-8 , 5 , 2 , 8 ,-2 , 3 ,-5 , 7 ,-3 , 1 ,-1 ,-8 ,-18, 3 ,-7 ,-22,-3 ,-19]}
dials = [0, 0, 0, 0]

def incr():
  dials[0] = (dials[0] + 1) % 26
  if(dials[0]==0):
    dials[1] = (dials[1] + 1) % 26
  if(dials[1]==0):
    dials[2] = (dials[2] + 1) % 26

def shift(char,level):
  return(chr(ord(char) - 97 + wheels[level][(ord(char) - 97 + dials[level]) % 26]))

def on_press(key):
  # Use global variable input in order to keep track of current word.
  global userInput
  try:
    userInput += key.char
  except AttributeError:
    #print('special key {0} pressed'.format(key))
    if key == Key.space: 
      userInput += ' '

def on_release(key):
  if key == Key.enter:
    return False
  elif key == Key.esc: 
    return False

def route(char):
  #process the character through each level of scrambling
  incr()


# esc to escape listener.
userInput = ""
with Listener(on_press=on_press, on_release=on_release) as listener:
  listener.join()
print('userInput', userInput)

从这一点开始,您必须将用户输入合并到您的机器的Enigma cypher方面。我应该提到我对你的代码做了一些小的修改。例如,侦听器应该能够理解空格

如果您有任何后续问题,请告诉我

相关问题 更多 >