pyside6 为组件添加动画示例
示例1 修改 geometry 属性
| |
| |
| from asyncio import sleep |
| import sys, os, time |
| from PySide6 import QtCore, QtWidgets, QtGui, QtStateMachine |
| |
| class Example(QtWidgets.QWidget): |
| |
| def __init__(self): |
| super().__init__() |
| |
| self.initUI() |
| |
| def initUI(self): |
| |
| self.button = QtWidgets.QPushButton("Start", self) |
| self.button.clicked.connect(self.doAnim) |
| self.button.move(30, 30) |
| |
| self.frame = QtWidgets.QFrame(self) |
| self.frame.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Raised) |
| self.frame.setGeometry(150, 30, 100, 100) |
| |
| self.setGeometry(300, 300, 380, 300) |
| self.setWindowTitle('Animation') |
| self.show() |
| |
| def doAnim(self): |
| |
| self.anim = QtCore.QPropertyAnimation(self.frame, b"geometry") |
| self.anim.setDuration(10000) |
| self.anim.setStartValue(QtCore.QRect(150, 30, 100, 100)) |
| self.anim.setEndValue(QtCore.QRect(150, 30, 200, 200)) |
| self.anim.start() |
| |
| if __name__ == "__main__": |
| app = QtWidgets.QApplication([]) |
| ex = Example() |
| ex.show() |
| app.exec_() |
| |
示例2 动画修改长度, 可以实现进度条
| # -*- coding: utf-8 -*- |
| # coding:unicode_escape |
| from asyncio import sleep |
| import sys, os, time |
| from PySide6 import QtCore, QtWidgets, QtGui, QtStateMachine |
| |
| class Example(QtWidgets.QWidget): |
| |
| def __init__(self): |
| super().__init__() |
| |
| self.initUI() |
| |
| def initUI(self): |
| |
| self.button = QtWidgets.QPushButton("Start", self) |
| self.button.clicked.connect(self.doAnim) |
| self.button.move(30, 30) |
| |
| self.frame = QtWidgets.QWidget(self) |
| self.frame.setStyleSheet("background-color: red") |
| self.frame.resize(30, 50) |
| |
| self.resize(200, 200) |
| self.setWindowTitle('Animation') |
| self.show() |
| |
| def doAnim(self): |
| |
| self.anim = QtCore.QPropertyAnimation(self.frame, b"size") |
| self.anim.setDuration(1000) |
| self.anim.setStartValue(QtCore.QSize(30,50)) |
| self.anim.setEndValue(QtCore.QSize(100,50)) |
| self.anim.start() |
| |
| if __name__ == "__main__": |
| app = QtWidgets.QApplication([]) |
| ex = Example() |
| ex.show() |
| app.exec_() |
示例3 实现进度条
| import re |
| import sys, os, time, math |
| from PySide6 import QtCore, QtWidgets, QtGui |
| class LoadWidget(QtWidgets.QDialog): |
| def __init__(self, endObj): |
| super().__init__() |
| self.endObj = endObj |
| self.main_layout = QtWidgets.QVBoxLayout(self) |
| |
| self.setStyleSheet("background-color: #fff;") |
| self.testWidght = QtWidgets.QWidget() |
| self.testWidght.setStyleSheet("background-color: #fffff0;") |
| self.testWidght_layout = QtWidgets.QVBoxLayout(self.testWidght) |
| self.testWidght_layout.setContentsMargins(0, 0, 0, 0) |
| |
| self.prosse_layout = QtWidgets.QHBoxLayout() |
| |
| |
| self.testWidght.setFixedSize(480, 30) |
| self.prosse_layout.addWidget(self.testWidght) |
| |
| |
| self.title_lable = QtWidgets.QLabel("正在升级,请稍后...") |
| |
| self.title_lable.setFont(QtGui.QFont("黑体", 10)) |
| |
| self.title_lable.setFixedHeight(25) |
| |
| self.title_lable.setContentsMargins(0, 0, 0, 10) |
| |
| self.main_layout.setAlignment(QtCore.Qt.AlignCenter) |
| self.main_layout.addWidget(self.title_lable) |
| self.main_layout.addLayout(self.prosse_layout) |
| |
| self.speval = 0 |
| self.prosse_len = 480 |
| self.resize(520, 90) |
| |
| self.setFixedSize(self.width(), self.height()) |
| |
| self.setWindowFlags(QtCore.Qt.CustomizeWindowHint|QtCore.Qt.WindowStaysOnTopHint) |
| self.set_pross(0) |
| self.show() |
| |
| def set_pross(self, speval): |
| if(speval == 0): |
| |
| |
| self.prosse = QtWidgets.QPushButton(self.testWidght,"测试") |
| self.prosse.resize(30, 0) |
| |
| self.prosse.setStyleSheet("background-color: rgba(133, 122, 144, 0.5);") |
| self.pross_animation = QtCore.QPropertyAnimation(self.prosse, b'size') |
| self.pross_animation.finished.connect(self.finished_animation) |
| self.pross_height = 30 |
| self.pross_status = QtCore.QSize(0, self.pross_height) |
| |
| self.pross_num = math.ceil(self.prosse_len * speval); |
| if(self.pross_num > self.prosse_len): |
| self.pross_num = 490 |
| |
| self.pross_animation.setStartValue(self.pross_status) |
| self.pross_status = QtCore.QSize(self.pross_num, 30) |
| self.pross_animation.setEndValue(self.pross_status) |
| self.pross_animation.setDuration(1000) |
| self.pross_animation.setEasingCurve(QtCore.QEasingCurve.OutSine) |
| self.pross_animation.start() |
| self.speval = speval |
| |
| def finished_animation(self): |
| self.prosse.setStyleSheet("background-color: green;") |
| if(self.speval < 1): |
| |
| |
| |
| |
| |
| self.set_pross(self.speval + 0.1) |
| |
| else: |
| print("动画执行完毕") |
| self.prosse.setStyleSheet("background-color: rgba(255, 255, 255, 0);") |
| self.close() |
| |
| def closeEvent(self, event): |
| print("--------------> pross end1") |
| |
| class MyWidget_test(QtWidgets.QMainWindow): |
| def __init__(self): |
| super().__init__() |
| self.right_layout = QtWidgets.QVBoxLayout() |
| self.button = QtWidgets.QPushButton("开始升级") |
| self.button1 = QtWidgets.QPushButton("取消升级") |
| self.right_layout.addWidget(self.button) |
| self.right_layout.addWidget(self.button1) |
| |
| self.button.clicked.connect(self.click_button) |
| self.button1.clicked.connect(self.click_button1) |
| |
| |
| main_widght = QtWidgets.QWidget(self) |
| main_widght.setLayout(self.right_layout) |
| |
| self.setCentralWidget(main_widght) |
| self.resize(700, 500) |
| self.setWindowOpacity(0.9) |
| self.show() |
| |
| def click_button1(self): |
| self.loadWidget.close() |
| self.loadWidget.destroy() |
| |
| def click_button(self): |
| self.loadWidget = LoadWidget(self) |
| |
| def closeEvent(self, event): |
| print("--------------> pross end2") |
| self.loadWidget.close() |
| if __name__ == '__main__': |
| app = QtWidgets.QApplication([]) |
| widget = MyWidget_test() |
| widget.setWindowTitle("升级") |
| sys.exit(app.exec()) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?