【问题标题】:Avoiding raw_input to take keys pressed while in a loop for windows避免 raw_input 在 Windows 的循环中按下按键
【发布时间】:2011-12-21 09:55:08
【问题描述】:

我正在尝试制作一个循环中有 raw_input 的程序,如果有人在长循环运行时按下一个键,下一个 raw_input 会将其作为输入,我该如何避免这种情况?

对于这个简单的问题,我不知道还有什么要补充的。如果需要更多信息,请告诉我。

编辑

一些代码

for i in range(1000):
  var = raw_input("Enter the number")
  #.... do some long magic and stuff here which takes afew seconds
  print 'Output is'+str(output)

因此,如果有人在魔法阶段按下了某些东西,则将其作为下一个循环的输入。这就是问题的开始。 (是的,循环必须运行 1000 次)。

【问题讨论】:

  • 向我们展示您正在使用的代码,这样会更容易为您提供帮助
  • 我不能准确地展示代码,但让我给你看一些等效的东西。
  • 可能重复stackoverflow.com/questions/2520893/…。请让我们知道您的操作系统。解决方案非常特定于操作系统。
  • 我把操作系统放在标题中,具体来说是window 7 64 bit。我在那里看到了答案。他们确实适用,但上帝他们是如此之大。难道没有其他 n00b 友好且更安全的输入方式吗?

标签: python windows raw-input


【解决方案1】:

这适用于我的 Windows 7 64 位、python 2.7。

import msvcrt

def flush_input():
  while msvcrt.kbhit():
    msvcrt.getch()

【讨论】:

    【解决方案2】:

    我把操作系统放在标题中,具体来说是window 7 64 bit。我看到了 那里的答案。他们确实适用,但上帝,他们是如此之大。不在吗 其他 n00b 友好且更安全的输入方式?

    让我试着解释一下为什么你需要做这样一个复杂的过程。当您按下一个键时,它存储在称为键盘缓冲区的计算机内存部分(不要与标准输入缓冲区混淆)。这个缓冲区存储按键的按下,直到它被您的程序处理。 Python 不提供任何独立于平台的包装器来执行此任务。您必须依赖操作系统特定的系统调用来访问此缓冲区,并刷新、读取或查询它。 msvcrt 是一个 MS VC++ 运行时库,python msvcrt 提供了一个包装器。除非您不想要一个独立于平台的解决方案,否则它非常简单。

    使用 msvcrt getch 从控制台读取字符。 msvcrt.kbhit() 测试键盘缓冲区中是否存在按键等。所以正如 MattH 所展示的,它只是几行代码。如果您认为自己是菜鸟,请借此机会学习新事物。

    【讨论】:

      【解决方案3】:

      只需在循环之外收集您的输入(在您进入循环之前)。您真的希望用户输入 1000 个数字吗?好吧,也许你会。但只需在顶部包含一个循环并在开始时收集 1000 个数字,并将它们存储在一个数组中。

      然后在下半部分更改您的循环,以便它完成所有工作。那么如果有人在没有键盘的情况下输入了一些东西,那就不再重要了。

      类似这样的:

          def getvars(top=1000):
              vars = []
              for i in range(0,top):
                  anum = int(raw_input('%d) Please enter another number: ' % i))
                  vars.append(anum) 
              return vars
      
          def doMagic(numbers):
              top = len(numbers)
              for number in numbers: 
                  # do magic number stuff
                  print 'this was my raw number %s' % number
      
          if __name__ == "__main__":
              numbers = getvars(top=10)
              doMagic(numbers)
      

      以不同的方式呈现,更少依赖操作系统

      还有另一种可行的方法。我没有方便的 windows 框来测试它,但它是我曾经使用的一个技巧,而且它没有记录。也许我在泄露秘密......但它基本上是这样的:通过在你的魔法计算开始时调用打开屏幕保护程序功能的 api,让操作系统认为你的应用程序是一个屏幕保护程序。在魔术计算结束或准备好再次接受输入时,再次调用 api 并关闭屏幕保护功能。

      这样会行。

      还有另一种方法可以做到这一点。由于您在 Windows 中,因此这也可以。但它的工作量相当大,但并不是太多。在 Windows 中,作为前景的窗口(在 Z 顺序的顶部)该窗口获取“原始输入线程”。原始输入线程接收鼠标和键盘输入。因此,要捕获所有输入,您需要做的就是创建一个位于 Z 顺序顶部的透明或(非透明)窗口的函数 setWindowPos 可以解决问题,让它覆盖整个屏幕并可能显示消息,例如 Even Geduld 或 Please wait 当您准备好提示用户更多输入时,您可以使用 showwindow() 隐藏窗口,显示之前的结果,获取输入,然后重新显示窗口并重新捕获键/鼠标。

      当然,所有这些解决方案都将您绑定到特定的操作系统,除非您实现某种 try/except 处理和/或包装低级 Windows SDK 调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 2021-09-21
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多