我 的 个 人 主 页: 失心疯的个人主页
入 门 教 程 推 荐 : Python零基础入门教程合集
虚 拟 环 境 搭 建 : Python项目虚拟环境(超详细讲解)
PyQt5 系 列 教 程: Python GUI(PyQt5)文章合集
Oracle数据库教程: Oracle数据库文章合集
优 质 资 源 下 载 : 资源下载合集
作用
动画类继承结构图
动画类说明
QAbstractAnimation # 动画基类(抽象类)
QVariantAnimation # 属性动画父类
QPropertyAnimation # 属性动画类(按照动画效果修改控件的属性,如:pos<位置>、size<大小>等)
QPauseAnimation # 暂停动画类
QAnimationGroup # 动画分组类(把多个单个的动画分到一组,让这些动画同时启停或者按顺序启停)
QParallelAnimationGroup # 并行动画组类
QSequentialAnimationGroup # 串行动画组类
QPropertyAnimation(parent) # 创建动画对象的同时设置父对象
QPropertyAnimation(target, propertyName, parent) # 创建动画对象的同时设置绑定对象和属性,并设置父对象
setTargetObject(self,QObject) # 设置动画绑定对象(控件)
targetObject(self) # 获取动画绑定对象
setPropertyName(self, propertyName: Union[QByteArray, bytes, bytearray]) # 设置要绑定动画的属性
# 注意:设置属性名称的时候,需要以字节的方式设置。如:b'pos' , b'size'
propertyName(self) # 获取绑定了动画的属性,返回QByteArray
pos # 位置属性,通过QPoint对象设置
size # 尺寸属性,通过QSize对象设置
geometry # 尺寸和位置属性,通过QRect对象设置
windowOpacity # 不透明度属性,从1.0到0.0,从不透明到完全透明
setStartValue(self, value) # 设置开始值
setEndValue(self, value) # 设置结束值
setKeyValueAt(self, step, value) # 设置关键值,step:从0.0到1.0,表示动画时长中的一个点
# 在这个地方step用分数表示更好理解,setKeyValueAt(1/2, 0)即表示动画时长的1/2处时,属性值由开始值变成0
setKeyValues(self, values) # 设置关键值组,通过迭代器设置多个关键值
# values: Iterable[Tuple[float, Any]]
# animation.setKeyValues([(0, 1), (0.5, 0), (1, 1)]) # 设置关键值组,通过迭代器设置多个关键值
setDuration(int msecs) # 设置单次动画时长
setEasingCurve(self, easing) # 设置动画曲线
# easing: Union[QEasingCurve, QEasingCurve.Type]
# easing常用值
# Linear # 匀速
# InQuad # 由慢到快
# OutQuad # 由快到慢
# InBounce # 开始时弹簧效果
# OutBounce # 结束时弹簧效果
start() # 启动动画
# 1. 创建动画对象,并绑定控件、属性
# 2. 设置开始值、关键值、结束值
# 3. 设置动画时长
# 4. 设置动画曲线
# 5. 启动动画
from PyQt5.Qt import *
import sys
class Windows(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('动画学习')
self.resize(500, 500)
self.widget_list()
def widget_list(self):
self.add_widget()
def add_widget(self):
btn = QPushButton('测试', self)
btn.resize(100, 100)
# 1. 创建动画对象,并绑定控件、属性
# 方法一
# animation = QPropertyAnimation(self) # 创建动画对象
# animation.setTargetObject(btn) # 绑定控件
# animation.setPropertyName(b"pos") # 绑定属性
# 方法二
animation = QPropertyAnimation(btn, b"pos", self) # 位置属性
# animation = QPropertyAnimation(btn, b"size", self) # 大小属性
# animation = QPropertyAnimation(btn, b'geometry', self) # 位置和大小属性
# animation = QPropertyAnimation(self, b'windowOpacity', self) # 不透明度属性
# 2. 设置开始值、关键值、结束值
animation.setStartValue(QPoint(0, 0)) # 设置开始pos值
animation.setEndValue(QPoint(400, 400)) # 设置结束pos值
# animation.setStartValue(QSize(100, 100)) # 设置开始size值
# animation.setEndValue(QSize(400, 400)) # 设置结束size值
# animation.setStartValue(QRect(0, 0, 50, 50)) # 设置开始geometry值
# animation.setEndValue(QRect(300, 300, 200, 200)) # 设置结束geometry值
# animation.setStartValue(1) # 设置开始值,在动画开始时windowOpacity属性的值为0
# animation.setKeyValueAt(1/2, 0) # 设置关键值,在动画时长的1/2处,windowOpacity属性的值由1变为0
# animation.setEndValue(1) # 设置结束值,在动画结束时,windowOpacity属性的值由0变为1
# animation.setKeyValues([(0, 1), (0.5, 0), (1, 1)]) # 设置关键值组,通过迭代器设置多个关键值
# 3. 设置动画时长
animation.setDuration(1000)
# 4. 设置动画曲线
# animation.setEasingCurve(QEasingCurve.Linear) # 匀速,默认
# animation.setEasingCurve(QEasingCurve.InQuad) # 由慢到快
# animation.setEasingCurve(QEasingCurve.OutQuad) # 由快到慢
# animation.setEasingCurve(QEasingCurve.InBounce) # 开始时弹簧效果
animation.setEasingCurve(QEasingCurve.OutBounce) # 结束时弹簧效果
# 5. 启动动画
animation.start()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Windows()
window.show()
sys.exit(app.exec_())
setStartValue(self, value) # 设置开始值
startValue() # 获取开始值,返回QVariant
setEndValue(self, value) # 设置结束值
endValue() # 获取结束值,返回QVariant
setKeyValueAt(self, step, value) # 设置关键值,step:从0.0到1.0,表示动画时长中的一个点
keyValueAt() # 获取关键值,返回QVariant
# 在这个地方step用分数表示更好理解,setKeyValueAt(1/2, 0)即表示动画时长的1/2处时,属性值由开始值变成0
setKeyValues(self, values) # 设置关键值组,通过迭代器设置多个关键值
keyValues() # 获取关键值组,返回QVariantAnimation
# values: Iterable[Tuple[float, Any]]
# animation.setKeyValues([(0, 1), (0.5, 0), (1, 1)]) # 设置关键值组,通过迭代器设置多个关键值
setDuration(int msecs) # 设置单次动画时长
setEasingCurve(self, easing) # 设置动画曲线
# easing: Union[QEasingCurve, QEasingCurve.Type]
# easing常用值
# Linear # 匀速
# InQuad # 由慢到快
# OutQuad # 由快到慢
# InBounce # 开始时弹簧效果
# OutBounce # 结束时弹簧效果
setLoopCount(int loopCount) # 设置动画循环次数
loopCount() ——> int # 获取设置的动画循环总次数
currentLoop() ——> int # 获取动画的当前循环次数,从0开始
currentLoopTime() ——> int # 获取当前循环内的时间(从当次循环开始计算时间)
setDirection(QAbstractAnimation.Direction) # 设置动画方向
dirction() ——> QAbstractAnimation.Direction # 获取动画方向
# 参数 QAbstractAnimation.Direction
# QAbstractAnimation.Forward # 按时间正顺运行
# 即 从开始值到结束值
# QAbstractAnimation.Backward # 按时间倒序运行
# 即 从结束值到开始值(类似于视频倒放)
duration() ——> int # 获取单次动画时长
toralDuration() ——> int # 获取动画总时长
currentTime() ——> int # 获取动画当前时长
currentLoopTime() ——> int # 获取当前循环内的当前时间(从当次循环开始计算时间)
pause() # 暂停动画,可恢复运行
resume() # 继续动画,恢复暂停的动画
stop() # 停止动画,不可恢复运行
start(QAbstractAnimation.DeletionPolicy) # 开始动画,并可以设置删除策略
# 参数 QAbstractAnimation.DeletionPolicy
# QAbstractAnimation.KeepWhenStopped # 停止动画时不删除动画
# QAbstractAnimation.DeleteWhenStopped # 停止动画时自动删除动画
setCurrentTime(int) # 设置当前时间
setPause(bool) # 设置是否暂停(相当于pause()+resume())
state() ——> QAbstractAnimation.State # 获取动画当前状态
# 参数 QAbstractAnimation.State
# QAbstractAnimation.Stopped # 停止状态,0
# QAbstractAnimation.Paused # 暂停状态,1
# QAbstractAnimation.Running # 运行状态,2
currentLoopChanged(int currentLoop) # 当前循环次数发生改变时发射该信号,并传递当前循环次数
directionChanged(newDirection) # 动画方向发生改变时发射该信号,并传递新的动画方向(QAbstractAnimation.Direction)
finished() # 动画所有循环完成时发射该信号
stateChanged(newState, oldState) # 动画状态发生改变时发射该信号,并传递新状态和老状态(QAbstractAnimation.State)
from PyQt5.Qt import *
import sys
class Windows(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QAbstractAnimation-功能作用')
self.resize(500, 300)
self.btn2 = QObject
self.animation = QObject
self.widget_list()
def widget_list(self):
self.add_widget()
def add_widget(self):
btn = QPushButton(self)
self.btn = btn
btn.resize(50, 50)
btn1 = QPushButton('获取循环信息', self)
btn1.setObjectName('btn1')
btn1.resize(100, 30)
btn1.move(50, 100)
btn2 = QPushButton('设置动画方向', self)
self.btn2 = btn2
btn2.setObjectName('btn2')
btn2.resize(100, 30)
btn2.move(170, 100)
btn3 = QPushButton('开始动画', self)
self.btn3 = btn3
btn3.setObjectName('btn3')
btn3.resize(100, 30)
btn3.move(50, 140)
btn4 = QPushButton('暂停动画', self)
self.btn4 = btn4
btn4.setObjectName('btn4')
btn4.resize(100, 30)
btn4.move(170, 140)
# 定义动画,设置绑定控件对象和属性
animation = QPropertyAnimation(btn, b'pos', self)
animation.setObjectName('animation')
self.animation = animation
# 通过关键值组设置开始值、关键值和结束值
animation.setKeyValues([(0, QPoint(0, 0)), (1/2, QPoint(450, 0)), (1, QPoint(0, 0))])
# 设置单个动画总时长
animation.setDuration(3000)
# 设置动画循环次数
animation.setLoopCount(3)
# animation.currentLoopChanged.connect(lambda v: print(f'动画当前循环第【{v}】次'))
# animation.directionChanged.connect(lambda v:print('动画方向发生了改变', v))
# animation.finished.connect(lambda :print('动画所有循环都完成了!'))
# animation.stateChanged.connect(lambda ns,os:print(f'动画状态由{os}变成了{ns}'))
# 启动动画
# animation.start()
# 设置self对象开启装饰器自动连接信号与槽
QMetaObject.connectSlotsByName(self)
def stop_animation(self):
if self.animation.direction() == QAbstractAnimation.Backward:
self.btn.move(450, 0)
elif self.animation.direction() == QAbstractAnimation.Forward:
self.btn.move(0, 0)
self.animation.stop()
self.btn3.setText('开始动画')
def start_animation(self):
self.animation.start()
self.btn3.setText('停止动画')
@pyqtSlot()
def on_btn1_clicked(self):
print('动画循环总次数:', self.animation.loopCount())
print('动画当前循环次数:', self.animation.currentLoop())
print('动画当前循环时间:', self.animation.currentLoopTime())
print('')
@pyqtSlot()
def on_btn2_clicked(self):
self.animation.setKeyValues([(0, QPoint(0, 0)), (1, QPoint(450, 0))])
self.stop_animation()
if self.animation.direction() == QAbstractAnimation.Backward:
self.animation.setDirection(QAbstractAnimation.Forward)
self.btn2.setText('倒序运行')
elif self.animation.direction() == QAbstractAnimation.Forward:
self.animation.setDirection(QAbstractAnimation.Backward)
self.btn2.setText('正序运行')
self.start_animation()
@pyqtSlot()
def on_btn3_clicked(self):
if self.animation.state() == QAbstractAnimation.Stopped:
self.start_animation()
self.btn3.setText('停止动画')
elif self.animation.state() == QAbstractAnimation.Running:
self.stop_animation()
self.btn3.setText('开始动画')
@pyqtSlot()
def on_btn4_clicked(self):
if self.animation.state() == QAbstractAnimation.Running:
self.animation.pause()
self.btn4.setText('恢复动画')
elif self.animation.state() == QAbstractAnimation.Paused:
self.animation.resume()
self.btn4.setText('暂停动画')
@pyqtSlot(int)
def on_animation_currentLoopChanged(self, current_loop):
print(f'当前循环第【{current_loop}】次')
def on_animation_directionChanged(self, new_direction):
print(f'动画方向发生了改变,当前方向为:{new_direction}')
def on_animation_finished(self):
print('动画完成了!')
def on_animation_stateChanged(self, ns, os):
print(f'动画状态由{os}变成了{ns}')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Windows()
window.show()
sys.exit(app.exec_())