QLabel未在小部件

时间:2018-02-17 19:25:29

标签: python python-3.x pyqt pyqt5

我正在为心理学实验编写一个程序。

参与者将看到描绘三个物体碰撞的动画的5种变体。动画的显示顺序取决于确定顺序的不同功能的输出(这使得每个参与者的动画顺序不同)。

由于动画非常相似,它们由单个函数触发,该函数在其中具有控制对象运动的条件。此功能是一个连接到5个按钮的插槽(每个按钮位于不同的页面上)。按下其中一个按钮时,将显示相应的动画。

我遇到的问题是,对于第一个动画,对象完全显示在窗口中。但是,当我点击第2,第3,第4和第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())

每次调用插槽时,currentTrialIndex都会更新,这样可以确保每次调用函数时都会更改放置对象的窗口小部件(通过读取excel文件来更新currentTrialIndex以确定参与者所在的审判,在文件的其他地方完成)

我的程序中有打印语句,所以我可以检查每个试验的值是否正确更新...例如,当显示第一个动画时(此动画正确显示),这是我的打印输出。当您看到试用小部件列表中第一个对象的编号与打印的试用小部件和A的父级匹配时

index= 0
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 0x115e37708>
parentOfA= <PyQt5.QtWidgets.QWidget object at 0x115e37708>

当第二个动画显示时,她是我的打印输出,但不是。正如您将看到试用小部件列表中第二个对象的编号与打印的试用小部件和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)

1 个答案:

答案 0 :(得分:0)

我现在已经解决了这个问题。我在动画功能中隐藏了QLabel,之后忘了重新显示它们。

由于