3

我正在尝试制作一个在循环中具有 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 次)。

4

3 回答 3

3

这适用于 Windows 7 64bit,python 2.7。

import msvcrt

def flush_input():
  while msvcrt.kbhit():
    msvcrt.getch()
于 2011-12-21T10:20:14.990 回答
1

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

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

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

于 2011-12-21T10:46:57.060 回答
1

只需在循环之外收集您的输入(在您进入循环之前)。您真的希望用户输入 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 调用。

于 2011-12-21T12:41:13.943 回答