0

我是psychopy和python的新手。我正在尝试编写一种方法来退出脚本(我没有编写),例如通过按键。我已将此添加到 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 语句的内容使其工作。因此,对于其他有此困难的人来说,我最初的猜测是正确的:在繁忙时间没有记录按键(即在我的情况下是一个不断检查时间的 while 语句),或者可能只在特定的繁忙时间......也许有人更多的知识可以澄清。

4

2 回答 2

2

....所以我猜按键只在特定时间注册。那些时间是什么时候?注册按键需要什么?...

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

  • event.waitKeys()[1]
  • 事件.clearEvents()[1]
  • 事件.getKeys()[2]
  • 事件.Mouse.getPressed()
  • win.flip()
  • 核心等待()
  • visual.Window.dispatchAllWindowEvents()

1:这些函数还会从事件列表中删除所有现有的键盘事件。这意味着将来对 getKeys() 之类的函数的任何调用都只会返回一个键盘事件,如果它发生在最后一次调用这些函数之一之后。

2:如果 keyList=None,和 * 一样,否则从 keyList kwarg 中的键事件列表中删除键。

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

因此,如果没有看到您提到的内部循环的完整来源,那么 event.getKeys() 似乎很有可能永远不会返回关键事件,因为内部循环中的其他调用正在消耗关键事件。因此,当调用外部 getKeys() 时,事件在键列表中的可能性非常低。

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

...奇怪的是,您这样说 ..[jonas 示例代码].. 有效,从 Sol 的回答来看,它似乎不应该。——佐尔康

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

于 2014-10-23T02:26:31.880 回答
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()在几微秒后运行一次。

于 2014-10-06T19:46:39.970 回答