【问题标题】:Binding key presses绑定按键
【发布时间】:2015-02-06 22:37:36
【问题描述】:

我目前正在做一个项目,我从笔记本电脑通过 ssh 连接到树莓派来控制一些电机。我用 Python 编写了一些代码,允许您输入一个字母,并根据字母向前或向后移动。但是,您必须在每个字母后按 Enter 键才能执行代码。 有没有一种方法可以让界面检测到字母而无需按回车键。 我知道你可以在 tkinter 中绑定按键,但我不能通过 ssh 做到这一点。 提前致谢

【问题讨论】:

  • @AnttiHaapala 我找不到那个,因为我不完全知道我在找什么
  • 基本上,您可以将 sys.stdin/terminal 置于“原始模式”并一次读取 1 个字符,如那里的一些答案所示。此处回答的诅咒也是一个选项,但随后整个终端将设置为诅咒模式。

标签: python python-3.x ssh raspberry-pi key-bindings


【解决方案1】:

您可以为此使用curses 库。

您可以使用screen.getch() 函数获取按下的键。它将返回密钥的十进制代码(请参阅ASCII Table)。

一个例子:

import curses


screen = curses.initscr()
curses.cbreak()
screen.keypad(1)

key = ''

while key != ord('q'):  # press <Q> to exit the program
    key = screen.getch()  # get the key
    screen.addch(0, 0, key)  # display it on the screen
    screen.refresh()

    # the same, but for <Up> and <Down> keys:
    if key == curses.KEY_UP:
        screen.addstr(0, 0, "Up")
    elif key == curses.KEY_DOWN:
        screen.addstr(0, 0, "Down")

curses.endwin()

【讨论】:

  • 好的,这就是我需要的东西,谢谢。如果我想打印输入的内容,您只需执行 print(key)。我不确定实际输入是什么
  • @JoranBeasley 虽然我从树莓派运行它,但我不使用 Linux 编码。我只是运行一些 Python 脚本。
  • 那是python ...但该代码仅适用于linux(即raspberrry pi)
  • 好的,谢谢,现在很清楚了。我将在我的代码中实现这一点。它应该工作。 :)
  • 使用 curses 可能有点矫枉过正,因为它主要用于绘制全屏 cli 应用程序。请参阅我的答案以将事件绑定到按键
【解决方案2】:

另一个选项是sshkeyboard 库。只需pip install sshkeyboard,然后使用以下代码通过 SSH 检测按键:

from sshkeyboard import listen_keyboard

def press(key):
    print(f"'{key}' pressed")

def release(key):
    print(f"'{key}' released")

listen_keyboard(
    on_press=press,
    on_release=release,
)

def press 中,您可以有一些逻辑来对特定键做出反应:

def press(key):
    if key == "up":
        print("up pressed")
    elif key == "down":
        print("down pressed")
    elif key == "left":
        print("left pressed")
    elif key == "right":
        print("right pressed")

【讨论】:

  • 感谢您的评论,自从上述学校项目以来,我已经去uni并毕业了。虽然没有尝试你的方法,但我更喜欢它,因为它对我来说更具可读性。
  • @george 恭喜毕业!
  • 恭喜!那么这对于将面临同样问题的其他人来说是一个很好的未来参考
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多