首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在每次不创建新的AnimationGroup的情况下更新AnimationGroup?

如何在每次不创建新的AnimationGroup的情况下更新AnimationGroup?
EN

Stack Overflow用户
提问于 2020-04-22 12:17:52
回答 1查看 46关注 0票数 0

我想运行一个具有不同变化动画的AnimationGroup。但问题是函数清除()

代码语言:javascript
复制
    self.group = QtCore.QSequentialAnimationGroup(self)
def anim(self):
    if X == True:
        self.group.addAnimation(self.animation_1)
        self.group.addAnimation(self.animation_2)
    elif X == False:
        self.group.addAnimation(self.animation_3)
        self.group.addAnimation(self.animation_4)
    self.group.start()
    self.group.clear()

显示错误

RuntimeError:类型为QVariantAnimation的包装C/C++对象已被删除

我不能一直创建一个新的团队。

代码语言:javascript
复制
def anim(self):
    self.group = QtCore.QSequentialAnimationGroup(self)
    if X == True:
        self.group.addAnimation(self.animation_1)
        self.group.addAnimation(self.animation_2)
    elif X == False:
        self.group.addAnimation(self.animation_3)
        self.group.addAnimation(self.animation_4)
    self.group.start()
    self.group.clear()

我试着用removeAnimation

代码语言:javascript
复制
import sys
from PyQt5 import QtWidgets, QtGui, QtCore

class Rad(QtWidgets.QWidget):
    def __init__(self, group, pos, parent=None):
        super(Rad,  self).__init__(parent)
        self.resize(50, 50)
        lay = QtWidgets.QVBoxLayout(self)
        self.radio = QtWidgets.QRadioButton()
        self.label = QtWidgets.QLabel()
        self.label.setText('but-{}'.format(pos))
        self.group = group
        self.pos = pos
        lay.addWidget(self.radio)
        lay.addWidget(self.label)
        self.radio.toggled.connect(self.fun)
        self.animation = QtCore.QVariantAnimation() 
        self.animation.setDuration(1000)  
        self.animation.valueChanged.connect(self.value)
        self.animation.setStartValue(100)
        self.animation.setEndValue(0)
        self.can = False
    def value(self, val):
        self.move(self.pos, val)
    def fun(self):
        self.animation.setStartValue(
            100
            if not self.can 
            else 0
        )
        self.animation.setEndValue(
            0
            if not self.can 
            else 100
        )
        if self.group.animationAt(1) == None :
            print("Bad")
        else :
            print("Good")
            self.group.removeAnimation(self.group.animationAt(0))
        self.group.addAnimation(self.animation)
        self.group.start()
        self.can = not self.can

class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.group = QtCore.QSequentialAnimationGroup(self)
        self.buts = QtWidgets.QButtonGroup(self, exclusive=True)
        wid_1 = Rad(self.group,   200, self)
        wid_2 = Rad(self.group,  100, self)
        wid_3 = Rad(self.group,  0, self)
        self.buts.addButton(wid_1.radio, 0)
        self.buts.addButton(wid_2.radio,1)
        self.buts.addButton(wid_3.radio, 2)
        wid_1.setStyleSheet('background:brown;')
        wid_2.setStyleSheet('background:yellow;')
        wid_3.setStyleSheet('background:green;')

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Test()
    w.resize(500, 500)
    w.show()
    sys.exit(app.exec_())

现在动画变得锋利了

在控制台输出中

q动画组::动画of :索引超出了

的范围

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-22 13:31:42

从我可以推断的是,您希望按下的项目向下移动,如果有任何项目处于较低的位置,那么它必须回到它的位置。如果是这样的话,我的答案应该是可行的。

您不应该使用clear方法,因为这样可以移除和删除动画,而应该使用takeAnimation(0),直到没有动画为止,只需要添加新的动画,但是这种逻辑不应该在"Rad“中,而应该在测试类中:

代码语言:javascript
复制
import sys
from PyQt5 import QtWidgets, QtGui, QtCore


class Rad(QtWidgets.QWidget):
    def __init__(self, text, parent=None):
        super(Rad, self).__init__(parent)
        self.resize(50, 50)
        self.radio = QtWidgets.QRadioButton()
        self.label = QtWidgets.QLabel()
        self.label.setText(text)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.radio)
        lay.addWidget(self.label)

        self.animation = QtCore.QVariantAnimation()
        self.animation.setDuration(1000)
        self.animation.valueChanged.connect(self.on_value_changed)
        self.animation.setStartValue(100)
        self.animation.setEndValue(0)

    @QtCore.pyqtSlot("QVariant")
    def on_value_changed(self, val):
        pos = self.pos()
        pos.setY(val)
        self.move(pos)

    def swap_values(self):
        self.animation.blockSignals(True)
        start_value = self.animation.startValue()
        end_value = self.animation.endValue()
        self.animation.setStartValue(end_value)
        self.animation.setEndValue(start_value)
        self.animation.blockSignals(False)


class Test(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.buts = QtWidgets.QButtonGroup(self, exclusive=True)
        wid_1 = Rad("but-200", self)
        wid_1.setStyleSheet("background:brown;")
        wid_1.move(200, 0)

        wid_2 = Rad("but-100", self)
        wid_2.setStyleSheet("background:yellow;")
        wid_2.move(100, 0)

        wid_3 = Rad("but-0", self)
        wid_3.setStyleSheet("background:green;")
        wid_3.move(0, 0)

        self.buts.addButton(wid_1.radio, 0)
        self.buts.addButton(wid_2.radio, 1)
        self.buts.addButton(wid_3.radio, 2)

        self.buts.buttonToggled.connect(self.on_button_toggled)

        self.group = QtCore.QSequentialAnimationGroup(self)

        self.last_widget = None

    @QtCore.pyqtSlot(QtWidgets.QAbstractButton, bool)
    def on_button_toggled(self, button, state):
        if state:
            wid = button.parent()
            if self.group.animationCount() > 0:
                self.group.takeAnimation(0)
            if isinstance(self.last_widget, Rad):
                self.last_widget.swap_values()
                self.group.addAnimation(self.last_widget.animation)
            wid.swap_values()
            self.group.addAnimation(wid.animation)
            self.group.start()
            self.last_widget = wid


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Test()
    w.resize(500, 500)
    w.show()
    sys.exit(app.exec_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61364930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档