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

我如何用python创建一个键盘侦听器,它将返回按下的键的字符?,python,python-3.x,keyboard,Python,Python 3.x,Keyboard,例如,当按下“f”键时,函数将返回字符“f”,这样我就可以运行ord(键)并获得按下键的ascii值。我正在尝试制作一个模拟Enigma密码机的程序,希望在窗口对焦时直接从键盘输入,密码输出打印到控制台上。(在一个单独但相关的注释中,我很难记住如何让print()函数在输出后省略换行符)。在我看来,pynput键盘模块是实现这一点的工具,但我不太清楚如何使用它。 这是我目前为止的完整代码。“on_press”和“on_release”函数,以及“with Listener(…”之后的所有内容都是

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

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

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

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

释放时的
函数可以被认为是帮助确定侦听器是否应该停止监听键盘的函数。如果释放时的
函数返回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)
从这一点开始,您必须将userInput合并到您的计算机的Enigma cypher方面。我应该提到,我对您的代码做了一些小的修改。例如,侦听器应该能够理解空格


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

我不太确定如何解决您的主要问题,但对于新行打印问题,您可以使用打印函数的end参数省略新行。例如,print('Hello world',end='')来源:啊,谢谢你…好吧,try/except也是这样,因为空格被视为“space”,而不是“space”?另外,我不想将它作为一个串联变量。我想使用侦听器而不是输入函数的原因是,我可以在按键时处理按键,然后打印出来(没有尾随的换行符)当它们被输入时。我是否可以简单地添加到“on_press”定义中,并告诉它打印出每个处理过的字母,而不是将它们添加到变量中?如果您想在字符被按下时处理字符,那么是的,您可以在
on_press