我正在写一个心理学实验的程序。在
参与者被展示了一个描述三物体碰撞的动画的5个变体。动画的显示顺序取决于决定顺序的不同函数的输出(这样每个参与者的动画顺序都是不同的)。在
由于动画非常相似,它们是由一个函数触发的,该函数中有条件控制对象的运动。此功能是一个插槽,连接5个按钮(每个按钮位于不同的页面上)。当按下其中一个按钮时,将显示相应的动画。在
我遇到的问题是,对于第一个动画,对象在窗口中显示得非常好。但是当我点击第二、第三、第四和第五动画时,这些对象根本不会出现在屏幕上。在
这是我在插槽中的代码:
trialWidgets = [ui.trialWidget_1, ui.trialWidget_2, ui.trialWidget_3, ui.trialWidget_4, ui.trialWidget_5]
print('trialwidgets=', trialWidgets)
trialWidget = trialWidgets[currentTrialIndex]
print('trialwidget=',trialWidget)
preTrialTimeMs = 1000
waitTimes = int(preTrialTimeMs/msPerFrame)
A = movingObject(startingPositionAx, startingPositionAy, diameter, 'blueCircleA.png', trialWidget)
B = movingObject(startingPositionAx + (horizontalDistance * 2), startingPositionAy, diameter, 'blueCircleB.png', trialWidget)
C = movingObject(startingPositionAx + (horizontalDistance), startingPositionAy - verticleDistance, diameter, 'blueCircleC.png', trialWidget)
print('parentOfA=', A.parent())
每次调用slot时currentTrialIndex都会更新,以确保每次调用函数时对象所在的小部件都会发生变化(currentTrialIndex通过读取excel文件来更新,以确定参与者在哪个试验中,这在文件的其他地方进行)
在我的程序中有打印语句,所以我可以检查值是否在每次试验中都适当地更新。。。例如,这是我的打印输出,当第一个动画显示(这个动画显示正确)。您将看到试用小部件列表中第一个对象的编号与打印的试用小部件和
^{pr2}$当第二个动画应该显示,但没有显示时,她就是我的打印输出。你会看到试用小部件列表中第二个对象的编号与打印的试用小部件和A的父对象相匹配,这是我所期望的,并且认为我的程序在值似乎正确的情况下可以工作。在
index= 1
trialwidgets= [<PyQt5.QtWidgets.QWidget object at 0x115e37708>,
<PyQt5.QtWidgets.QWidget object at 0x115e3d3a8>,
<PyQt5.QtWidgets.QWidget object at 0x115e40048>,
<PyQt5.QtWidgets.QWidget object at 0x115e42ca8>,
<PyQt5.QtWidgets.QWidget object at 0x1176a6948>]
trialwidget= <PyQt5.QtWidgets.QWidget object at 0x115e3d3a8>
parentOfA= <PyQt5.QtWidgets.QWidget object at 0x115e3d3a8>
我尝试了一些不同的方法,包括将其他对象直接分配给第2-5个小部件。他们出现了,所以我知道这和小部件无关。在
为什么这些小部件只在第一次试用中出现?在
下面是一些动画代码,以防有用。我不确定这是否相关,虽然我评论了下面的内容,但对象仍然没有出现在屏幕上
window.timerCount = 0
def moveObjects():
window.timerCount += 1
if currentCondition == 'incongruent':
incHorC = incHorTouch
incVerC = incVerTouch
elif currentCondition == 'congruent':
incHorC = -incHorTouch
incVerC = incVerTouch
elif currentCondition == 'indiscriminate':
incHorC = 0
incVerC = verticleDistance / noOfTimes
elif currentCondition == 'nearIncongruent':
incHorC = incHorN
incVerC = incVerN
else:
incHorC = -incHorN
incVerC = incVerN
if currentSide == 'collidesA':
incHorA = incHorTouch
incVerA = incVerTouch
incHorB = incHorGap - 1
incVerB = incVerGap - 1
bCanMove = window.timerCount > waitTimes and B.y() - incVerB > gapVerEndPoint
aCanMove = window.timerCount > waitTimes and window.timerCount <= noOfTimes + waitTimes
else:
incHorB = incHorTouch
incVerB = incVerTouch
incHorA = incHorGap - 1
incVerA = incVerGap - 1
incHorC = -incHorC
bCanMove = window.timerCount > waitTimes and window.timerCount <= noOfTimes + waitTimes
aCanMove = window.timerCount > waitTimes and A.y() - incVerA > touchVerEndPoint
if window.timerCount >= noOfTimes + waitTimes:
C.setGeometry(C.x() - incHorC, C.y() - incVerC, diameter, diameter)
if aCanMove:
A.setGeometry(A.x() + (incHorA), A.y() - (incVerA), diameter, diameter)
if bCanMove:
B.setGeometry(B.x() - (incHorB), B.y() - (incVerB), diameter, diameter)
if window.timerCount > (noOfTimes * 2) + waitTimes:
A.hide()
B.hide()
C.hide()
if window.timerCount > (noOfTimes * 2) + (waitTimes*2):
ui.experimentWindows.setCurrentIndex(ui.experimentWindows.currentIndex()+1)
window.animationTimer.stop()
window.animationTimer = QTimer()
window.animationTimer.timeout.connect(moveObjects)
window.animationTimer.start(msPerFrame)
我现在已经解决了。我把qlabel隐藏在animation函数中,后来忘了重新显示它们。在
谢谢
相关问题 更多 >
编程相关推荐