【问题标题】:How can I control a Python script with key inputs?如何使用按键输入控制 Python 脚本?
【发布时间】:2016-04-05 19:30:42
【问题描述】:

我创建了一个 Python 脚本,它可以从管道(命名为 pipe1)中获取命令。我测试了脚本(我在终端的管道中手动编写)并且它有效。

现在我想用另一个 Python 脚本控制脚本,如果我按 wasd,它可以写入管道。

你可以在Pastebin找到脚本

我从这个脚本开始:

在这个例子中,我只想打印我按下的键。稍后我将添加echo "" 命令写入管道,我之前测试过。

import time
import sys

def key_inp (event):
print 'Key:', event.char
key_press = event.char
sleep_time = 0.030

while True:
        try:
        if key_press.lower() == 'w':
        print "w"
        elif key_press.lower() == 's':
        print "s"
        elif key_press.lower() == 'a':
        print "a"
        elif key_press.lower() == 'd':
        print "d"
        elif key_press.lower() == 'q':
        print "q"
        elif key_press.lower() == 'e':
        print "e"
        elif key_press.lower() == 'p':
        print "stop"

        except(KeyboardInterrupt):
        print('Finished')

但我总是遇到同样的错误:

File "key.py", line 12  
    if key_press.lower() == 'w':  
     ^  
IndentationError: expected an indented block

我的问题是我没有找到像我一样有同样问题的人。 我对这个示例脚本的替代方案持开放态度。

【问题讨论】:

    标签: python input keyboard raspberry-pi robotics


    【解决方案1】:
    1. 您的问题与缩进有关,这在 Python 中非常重要

      def key_inp(event):
          print 'Key:', event.char
          key_press = event.char
          sleep_time = 0.030
      
          while True:
              try:
                  if key_press.lower() == 'w':
                      print "w"
                  elif key_press.lower() == 's':
                      print "s"
                  elif key_press.lower() == 'a':
                      print "a"
                  elif key_press.lower() == 'd':
                      print "d"
                  elif key_press.lower() == 'q':
                      print "q"
                  elif key_press.lower() == 'e':
                      print "e"
                  elif key_press.lower() == 'p':
                      print "stop"
      
              except(KeyboardInterrupt):
                  print('Finished')
      
    2. 你也可以试试下面的代码,在这种情况下它做同样的事情,但更简单:

      def key_inp(event):
          print 'Key:', event.char
          key_press = event.char
          sleep_time = 0.030
      
          while True:
              try:
                  if key_press.lower() == 'p':
                      print "stop"
                      # Do you also want exit here?
                      # If right, then add a `break` here. 
                  else:
                      print key_press.lower()
      
              except(KeyboardInterrupt):
                  print('Finished')
      
    3. 或者,如果您只想打印wsadqe,如果输入是这样的,如果输入不是这样,则不打印任何内容在该列表中(也不是p)。那么我建议使用如下列表:

      def key_inp(event):
          print 'Key:', event.char
          key_press = event.char
          sleep_time = 0.030
      
          while True:
              try:
                  if key_press.lower() in ['w', 's', 'a', 'd', 'q', 'e']:
                      print key_press.lower()
                  elif key_press.lower() == 'p':
                      print "stop"
      
              except(KeyboardInterrupt):
                  print('Finished')
      

    关于 Python 中的缩进,我发现 this mail 说:

    Python 使用缩进来定义块。例如,要显示哪个 语句由forif 语句控制,受控 语句是缩进的。你的书应该谈论这个。

    因此,在键入这些示例时,您需要在后面的行缩进 forifwhile。缩进可以是任何一致的空白。 四个空格是很常见的缩进。

    【讨论】:

    • 我投了赞成票,因为您已经回答了问题并提出了改进建议,但也许您可以将其编辑为不那么居高临下/磨损。例如,不需要将单词“very”全部大写并加粗重复三次。在建议改进之前与三个问号相同。它看起来就像你认为海报很愚蠢,但显然这只是编程/python新手的一个例子。
    • @Kiven Guan:谢谢!
    • @Kevin Guan 感谢您的快速答复。我现在的问题是,每当我执行脚本(使用您的编辑)时,它都会立即结束。我希望它继续,直到我按 Ctrl+c。如果我希望它永久继续,我必须改变什么?
    • @nudelkopf:你运行了这个函数吗?
    • @KevinGuan 我用 readchar 创建了一个新脚本:Pastebin。现在它适用于我的其他脚本。
    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多