问题1. 按键有缓冲
关于按键任务是怎么回事,见#跟着ChatGPT学PsychoPy编程系列1。
当我把该任务放到整个程序中时,具体来说,该任务出现在被试做完决策以及屏幕上呈现完“按键准备”的字样时。该任务一出现被试就要开始按键,时间限定为3秒,时间结束屏幕上出现被试的奖赏反馈信息,接着进入下一个试次。
bug问题描述:
然而,当我测试程序时,不论是在按键任务前按了空格键(比如在决策过程以及准备信息提示过程)还是在按键任务结束后(比如奖赏反馈过程)按了空格键,当来到按键阶段时,进度条已经增长了按一次空格增长的高度。按键任务之前的按空格键的操作会影响当前试次,之后的按空格键的操作会影响下一个试次。且不论提前或延后多按几下,都只会让进度条增长一下。
当我询问GPT这个问题,它反馈说我额外的按空格键的操作(按键任务前后,不包括按键过程中多按的)在键盘事件缓冲区有了记录,于是可以用一句代码来清除:
#清除键盘事件缓冲区中的按键记录
event.clearEvents(eventType='keyboard')
进一步解释:
-event.clearEvents(eventType='keyboard') 函数用于清除键盘事件缓冲区中的事件记录,而不是特定键的事件记录。
-当我们指定 eventType='keyboard' 时,它会清除键盘事件缓冲区中所有键的事件记录,包括空格键以及其他按键。
当我把这串代码按GPT的指示放在按键循环之上是,印象中开始没什么问题。但运行过几次或又小调了代码之后(或许是由于改过之后没有保存),总之,之后又出现了新的bug。见#问题2。
问题2. 总是第一下按键没反应-进度条不涨
第一下按键没反应,但是如果在奖赏反馈阶段或按键准备阶段按下了键,按键任务就可以正常进行。也就是按键还是有记录的。
这个问题询问GPT没有得到很好的解决。我考虑原因可能有多种。一,缓冲区中键盘事件清除的代码放置的位置可能不对,或许应该更早出现,比如放置在按键准备信息所在的routine结束后,而不是按键任务routine的起始。二,奖赏反馈信息与按键阶段写在一起,多少可能会混淆?所以我把反馈的代码写在了按键任务的end routine中。
这两步都操作了之后,程序就没有问题了!
更新(7.10下午):其实之后该问题还是时不时出现,阴差阳错地调整也都好了。但直到今天才发现“根源”所在!那就是,如果把按空格键,换成按别的键,比如'g'、'h',进度条的增加就是正常的!当我用g、h测试了之后,再换回空格键,空格键也正常了。还是很奇怪。。
问题3. 只有按10次的进度条最后会高出0.4
这个问题很奇怪,至今没想明白。但是经过调整这个部分的代码,我学到了代码的调整可以很灵活。
bug代码是这样的:
while timer.getTime() < success_time:
keys = event.getKeys()
if 'space' in keys and progress_bar.height < 0.4: # 修改位置
num_presses += 1
progress_bar.setHeight (progress_bar.height + fill_amount)
progress_bar.setPos((0,-0.2 + progress_bar.height/2))
rect.draw()
progress_bar.draw()
win.flip()
只修改了第4行:
while timer.getTime() < success_time:
keys = event.getKeys()
if 'space' in keys and num_presses < max_presses: # 修改位置
num_presses += 1
progress_bar.setHeight (progress_bar.height + fill_amount)
progress_bar.setPos((0,-0.2 + progress_bar.height/2))
rect.draw()
progress_bar.draw()
win.flip()
修改前后按道理表达的意思是相同的,但前者不行,后者就可以。迷思ing。
PS. 感悟时刻:这个部分记录了一些小问题,但是又很有启发性。1是感叹连这种问题都能解决,代码真强大,GPT这都知道,真厉害。2是办法总比困难多!搞程序还是需要多钻研。