无法中断心理脚本,event.getKeys()始终为空

时间:2014-10-02 17:49:11

标签: psychopy

我是心理学和蟒蛇的新手。我正在尝试编写一种方法来退出脚本(我没有写),例如按一个键。我已将此添加到while循环中:

while n < total
  start=time.clock()
  if len(event.getKeys()) > 0:
    break
  # Another while loop here that ends when time is past a certain duration after 'start'.

它不起作用,它没有注册任何按键。所以我猜测按键只在特定时间注册。那些时候是什么时候?注册按键需要什么?该循环非常快,每隔几毫秒发送一次信号,所以我不能在循环中添加等待命令。

如果我可以让一个并行线程检查按键是否也很好,但这听起来很复杂。

谢谢!

编辑:代码按预期运行(特别是没有错误)。包括“核心”和“事件”。没有任何其他“事件”命令会影响“按键日志”。

将循环内容的其余部分更改为包含core.wait语句的内容使其工作。所以对于其他遇到这种困难的人来说,我最初的猜测是正确的:在忙碌时间(即在我的情况下是一段不断检查时间的声明),或者可能只在特定的繁忙时间内,没有注册按键...也许是某人更多的知识可以澄清。

2 个答案:

答案 0 :(得分:1)

这不是一个真正的答案。这是尝试最小化重现错误。如果窗口在按键上关闭,则表示成功。它适用于我,所以我没有重现它。它对你有用吗?

from psychopy import event, visual, core
win = visual.Window()
clock = core.Clock()
while True:
    clock.reset()
    if event.getKeys():
        break

    while clock.getTime() < 1:
        pass

我没有安装time模块,所以我使用了psychopy.core.Clock()代替它,但它不应该有所作为,除非你的时间代码以无限循环结束,因此只运行几微秒后event.getKeys()一次。

答案 1 :(得分:1)

  

....所以我猜测按键只在特定时间注册   倍。那些时候是什么时候?注册密钥需要什么   压力机?....

为了尝试回答您的具体问题,导致键盘事件被注册的心理模糊api函数/方法是(现在更新,实际上是每个心理学1.81 API函数来执行此操作< / em>的):

  • event.waitKeys()[1]
  • event.clearEvents()[1]
  • event.getKeys()[2]
  • event.Mouse.getPressed()
  • win.flip()
  • core.wait()
  • visual.Window.dispatchAllWindowEvents()

1:这些功能还从事件列表中删除所有现有键盘事件。这意味着以后对getKeys()函数的任何调用只会在最后一次调用其中一个函数之后发生键盘事件。

2:如果keyList = None,则与*相同,否则从keyList kwarg中的键事件列表中删除键。

请注意,“调度”键盘事件的次数之一是在event.getKeys()调用本身。默认情况下,此功能还删除任何现有的键事件。

因此,在没有看到你提到的内部循环的完整源代码的情况下,很可能event.getKeys()永远不会返回一个键事件,因为内部循环中的某些其他调用正在使用键事件。因此,当调用外部getKeys()时,事件在键列表中的可能性非常低。

更新以回应OP对Jonas测试脚本的评论(我还没有足够的代表来为答案添加评论):

  

...奇怪你说这个.. [jonas示例代码] ..有效   从索尔的回答看来,它似乎不应该。 - zorgkang

也许我的回答是给出错误的理解,因为它旨在提供信息,说明为什么Jonas的示例应该,并且确实有效。 Jonas的示例代码是有效的,因为从事件缓冲区中删除键事件的唯一时间是调用getKeys()时,函数也返回任何被删除的事件,导致循环中断。