Python 如何在帧中生成动画
在这幅图中,我展示了一个程序,在这个程序中,我试图在鼠标位于我的橙色主框架上的那一刻显示一个框架。 但是,框架的外观非常突然。 我想知道我们是否可以创建一种动画,这样画面就不会以那种方式出现,而是向右滑动 代码: file.ui:Python 如何在帧中生成动画,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,在这幅图中,我展示了一个程序,在这个程序中,我试图在鼠标位于我的橙色主框架上的那一刻显示一个框架。 但是,框架的外观非常突然。 我想知道我们是否可以创建一种动画,这样画面就不会以那种方式出现,而是向右滑动 代码: file.ui: <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <w
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>552</width>
<height>397</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="styleSheet">
<string notr="true">background:qlineargradient(spread:pad, x1:0.565, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 0, 103, 0), stop:1 rgba(255, 255, 255, 0));</string>
</property>
<widget class="QWidget" name="centralwidget">
<property name="styleSheet">
<string notr="true"/>
</property>
<widget class="QPushButton" name="Ajustes">
<property name="geometry">
<rect>
<x>406</x>
<y>0</y>
<width>31</width>
<height>23</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">QPushButton#Ajustes{
background:none;
border:0px;
}</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>settings.png</normaloff>settings.png</iconset>
</property>
</widget>
<widget class="QFrame" name="frame1">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>431</width>
<height>401</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background:orange;</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
<widget class="QFrame" name="frame2">
<property name="geometry">
<rect>
<x>430</x>
<y>0</y>
<width>0</width>
<height>401</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background:red;</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
<zorder>frame1</zorder>
<zorder>Ajustes</zorder>
<zorder>frame2</zorder>
</widget>
</widget>
<resources/>
<connections/>
</ui>
主窗口
0
0
552
397
主窗口
背景:QlineArgent(排列:pad,x1:0.565,y1:0,x2:0.508475,y2:1,停止:0 rgba(0,0,103,0),停止:1 rgba(255,255,255,0));
406
0
31
23
QPushButton#Ajustes{
背景:无;
边界:0px;
}
settings.pngsettings.png
0
0
431
401
背景:橙色;
QFrame::StyledPanel
QFrame::提出
430
0
0
401
背景:红色;
QFrame::StyledPanel
QFrame::提出
框架1
阿朱斯特
框架2
我希望你能帮助我,我已经找到了一些相关的东西,但是我找不到如何制作这样的动画,如果你可以这样称呼它们你必须使用:
在这一行中,
self.\u animation=QtCore.QPropertyAnimation(self.frame2,b'size',self)
它是什么:b'size'@Mystic\u Force QPropertyAnimation用于设置qproperty的动画,在这种情况下,qproperty就是大小,这就是b'size',在eventFillter函数的watched
参数中,'watched'来自于此
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>552</width>
<height>397</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="styleSheet">
<string notr="true">background:qlineargradient(spread:pad, x1:0.565, y1:0, x2:0.508475, y2:1, stop:0 rgba(0, 0, 103, 0), stop:1 rgba(255, 255, 255, 0));</string>
</property>
<widget class="QWidget" name="centralwidget">
<property name="styleSheet">
<string notr="true"/>
</property>
<widget class="QPushButton" name="Ajustes">
<property name="geometry">
<rect>
<x>406</x>
<y>0</y>
<width>31</width>
<height>23</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">QPushButton#Ajustes{
background:none;
border:0px;
}</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>settings.png</normaloff>settings.png</iconset>
</property>
</widget>
<widget class="QFrame" name="frame1">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>431</width>
<height>401</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background:orange;</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
<widget class="QFrame" name="frame2">
<property name="geometry">
<rect>
<x>430</x>
<y>0</y>
<width>0</width>
<height>401</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">background:red;</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
<zorder>frame1</zorder>
<zorder>Ajustes</zorder>
<zorder>frame2</zorder>
</widget>
</widget>
<resources/>
<connections/>
</ui>
from PyQt5 import QtCore, QtWidgets, uic
class Principal(QtWidgets.QMainWindow):
def __init__(self):
super(Principal, self).__init__()
uic.loadUi("we.ui",self)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
self.setAttribute(QtCore.Qt.WA_NoSystemBackground, False)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.frame1.installEventFilter(self)
self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
self._animation.setStartValue(QtCore.QSize(0, self.height()))
self._animation.setEndValue(QtCore.QSize(121, self.height()))
self._animation.setDuration(200)
def eventFilter(self, watched, event):
if self.frame1 is watched:
if event.type() == QtCore.QEvent.Enter:
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
elif event.type() == QtCore.QEvent.Leave:
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
return super(Principal,self).eventFilter(watched, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
p = Principal()
p.show()
sys.exit(app.exec_())