1. 我设计了一个二元决策任务,选左按F键,选右按J键。键盘按键是用组件添加的,按键与内容的对应是用代码设置的。但是一开始没有考虑不按键的情况。我希望被试在规定时间(10s)内没有按键,实验会进入下一个试次。然而,在没有更改代码前,如果被试在10秒内没有按键,程序就闪退了!因此我询问了GPT解决办法,代码如下:
if key_resp.keys is not None and len(key_resp.keys) > 0:
# ps. key_resp是我的键盘组件名。这句意思是如果按键非空。这一句与最后的else,就是不闪退的精髓。
if key_resp.keys[0] == 'f':
position = (-0.3, 0)
elif key_resp.keys[0] == 'j':
position = (0.3, 0)
else:
continue # 自动进入下一个循环
2. 这一类闪退很常见。引用的变量名出错或在文件中输错了内容,例如应该是xx.xlsx而误写成xx.xlsx.xlsx。或者写错了代码。。为避免或减少这些问题,一定要仔细检查每一步。当然如果程序闪退,看一下报错!!报错显示的error前后的内容很可能就是出问题的地方。
报错示例1:
dur = random.uniform(0.8, 1.2) AttributeError: 'builtin_function_or_method' object has no attribute 'uniform'
事实上,这个部分我是希望让十字注视点的呈现时间是在0.8~1.2直接浮动的,这个在组件中没办法直接设置,因此需要借助代码。使用GPT没有得到想要的结果(测试没成功),于是百度,找到了答案,链接如下:
https://www.zhihu.com/question/426892075
# 也就是添加一个dur变量,再在文本组件(添加了'+'作为十字注视点)中的Stop-duration(s)属性中写入$dur
dur = randint(800, 1400)/1000
使用作者给出的原代码是没有任何问题的,但我尝试改变一下,改成
dur = randint(0.8, 1.2)
于是就出现了一开始呈现的报错内容!
询问GPT得到了答案:
-randint(a, b)函数是用于生成指定范围内的随机整数,包括a和b。这里的参数a和b都应该是整数。
-当您使用 randint(800, 1200)/1000 表达式时,先生成一个整数随机数,然后将其除以1000得到一个浮点数。这是因为除法操作会将整数隐式转换为浮点数。
-而当您使用 (0.8, 1.2) 这样的具体值时,它不符合 randint() 函数的参数要求,因为参数应该是整数,而不是浮点数。因此,直接使用 (0.8, 1.2) 会导致错误。
报错示例2:
ZeroDivisionError: float division by zero
GPT:
-ZeroDivisionError: float division by zero:这个错误意味着在程序中进行了一个浮点数除以零的除法操作,导致了除以零的错误。这通常发生在某个地方的除法表达式中,其中除数为零。
-要解决这个问题,你可以检查程序中的除法操作,并确保除数不为零。如果需要进行除以零的操作,你可以添加适当的条件判断来避免除以零的情况发生。
这个内容非常重要。因为我的代码中确实涉及到除法。一开始我定义除数为0,之后再对其进行赋值。这个报错直接提示我的赋值其实是不成功的,于是我去检查赋值部分的内容。
未来可能继续补充。7.8晚22点记。