class MoviePlayer(QMainWindow): def __init__(self, *args): QMainWindow.__init__(self, *args) # setGeometry(x_pos, y_pos, width, height) self.setGeometry(200, 200, 400, 400) self.setWindowTitle("QMovie to show animated gif") # set up the movie screen on a label self.movie_screen = QLabel() # expand and center the label self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) #btn_start = QPushButton("Start Animation", self) # btn_start.clicked.connect(self.start) btn_stop = QPushButton("Stop Animation", self) btn_stop.clicked.connect(self.stop) main_layout = QVBoxLayout() main_layout.addWidget(self.movie_screen) # main_layout.addWidget(btn_start) main_layout.addWidget(btn_stop) self.setLayout(main_layout) # use an animated gif file you have in the working folder # or give the full file path self.movie = QMovie("./AG_Dog.gif", QByteArray(), self) self.movie.setCacheMode(QMovie.CacheAll) self.movie.setSpeed(100) self.movie_screen.setMovie(self.movie) self.movie.start() def start(self): """sart animnation""" self.movie.start() def stop(self): """stop the animation""" self.movie.stop() print(self.movie.fileName()) self.movie.start()
def show_slides(self): try: i, img_object = self._result.get(True, 5) if isinstance(img_object, QMediaContent): self.MediaPlayer.setMedia(img_object) except Empty: self.timer.stop() return while i != self._next: self._result.put((i, img_object), False) i, img_object = self._result.get() if isinstance(img_object, QMediaContent): self.MediaPlayer.setMedia(img_object) if isinstance(img_object, QMediaContent): # If a movie # self.MediaPlayer.setMedia(img_object) self.layout.setCurrentWidget(self.VideoWidget) self.MediaPlayer.play() elif isinstance(img_object, QMovie): # If a gif size = img_object.scaledSize() img_object = QMovie(img_object.fileName()) img_object.setCacheMode(QMovie.CacheAll) self._gif = img_object img_object.frameChanged.connect(self.gif_frame_changed) self.SlideShowWidget.setMovie(img_object) size.scale(self.SlideShowWidget.size(), Qt.KeepAspectRatio) img_object.setScaledSize(size) img_object.setSpeed(int(self.rate * 100)) self.layout.setCurrentWidget(self.SlideShowWidget) # self.change_playspeed(self.rate) img_object.start() else: # If a picture # print(img_object.size()) self.SlideShowWidget.setPixmap( img_object.scaled(self.SlideShowWidget.size(), Qt.KeepAspectRatio)) self.timer.start(self.delay / self.rate) self.layout.setCurrentWidget(self.SlideShowWidget) self._next += 1 self.threading(self.maxqsize - self._result.qsize())
class Demo3(QDialog): def __init__(self, parent=None): QDialog.__init__(self, parent) self.setWindowTitle('show_gif') self.setWindowIcon(QIcon('image/Capture_64px.png')) self.setWindowFlags(self.windowFlags() | Qt.WindowMinMaxButtonsHint) # self.resize(400,400) self.setFixedSize(800, 600) mainl = QVBoxLayout(self) self.labelShow = QLabel() self.labelShow.setContentsMargins(0, 0, 0, 0) pat = self.labelShow.palette() pat.setBrush(QPalette.Background, Qt.darkGray) self.labelShow.setAutoFillBackground(True) self.labelShow.setPalette(pat) self.labelShow.setAlignment(Qt.AlignCenter) # self.labelShow.setScaledContents(True) mainl.addWidget(self.labelShow, 1) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) mainl.addWidget(line) btnLay = QHBoxLayout() frmLay = QFormLayout() self._spinBox = QSpinBox() frmLay.addRow('跳转:', self._spinBox) btnGo = QPushButton('Go', self) btnPrev = QPushButton('上一张', self) self.btnNext = QPushButton('下一张', self) btnPrev.clicked.connect(self.on_prev) self.btnNext.clicked.connect(self.on_next) btnGo.clicked.connect(lambda: self.flashMovie(self._spinBox.value())) self._spinBox.valueChanged.connect(lambda n: self.flashMovie(n)) btnLay.addStretch() btnLay.addLayout(frmLay) btnLay.addWidget(btnGo) btnLay.addWidget(btnPrev) btnLay.addWidget(self.btnNext) btnLay.addStretch() mainl.addLayout(btnLay) labLay = QHBoxLayout() labLay.setSpacing(10) self._label = QLabel() frm1 = QFormLayout() frm1.addRow('共:', self._label) frm1.setRowWrapPolicy(QFormLayout.WrapLongRows) labLay.addStretch() labLay.addLayout(frm1) frm1 = QFormLayout() self._labInfo = QLabel() # self._labInfo.setWordWrap(True) frm1.addRow('当前:', self._labInfo) # frm1.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) frm1.setRowWrapPolicy(QFormLayout.WrapLongRows) labLay.addLayout(frm1) frm1 = QFormLayout() self._labPlay = QLabel() frm1.addRow('播放帧号:', self._labPlay) labLay.addLayout(frm1) frm1.setRowWrapPolicy(QFormLayout.WrapLongRows) labLay.addStretch() labLay.setSpacing(10) line = QFrame() line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) mainl.addWidget(line) mainl.addLayout(labLay) self._gifs = [] self._movie = QMovie() self.labelShow.setMovie(self._movie) QTimer.singleShot(0, self.on_firstShow) self._picIndex = 0 self._movie.frameChanged.connect(self.on_frameChange) # self._movie.finished.connect(lambda:self.btnNext.clicked.emit()) def on_frameChange(self, n): self._labPlay.setText(' {} 帧'.format(n)) if n + 1 == self._movie.frameCount(): self.btnNext.clicked.emit() def on_firstShow(self): dir = r'E:\jiandanspider\pic' for i in os.listdir(dir): # print(os.path.isfile(i),i.lower(),i.lower().endswith('gif')) fullPath = os.path.join(dir, i) if os.path.isfile(fullPath) and i.lower().endswith('gif'): self._gifs.append(fullPath) self._spinBox.setMaximum(len(self._gifs)) self._label.setText('%03d条记录' % len(self._gifs)) if len(self._gifs) > 0: self._movie.setFileName(self._gifs[0]) self._movie.start() self._labInfo.setText('{},{}帧\n{}'.format( os.path.split(self._movie.fileName())[1], self._movie.frameCount(), self._movie.frameRect())) def flashMovie(self, index): if index >= len(self._gifs): return self._movie.stop() self._movie.setFileName(self._gifs[index]) self._movie.start() self._spinBox.valueChanged.disconnect() self._spinBox.setValue(index) self._labInfo.setText('{},{}帧\n{}'.format( os.path.split(self._movie.fileName())[1], self._movie.frameCount(), self._movie.frameRect())) self._spinBox.valueChanged.connect(lambda n: self.flashMovie(n)) self._picIndex = index def on_next(self): self._picIndex += 1 if self._picIndex >= len(self._gifs): self._picIndex = len(self._gifs) - 1 self.flashMovie(self._picIndex) def on_prev(self): self._picIndex -= 1 if self._picIndex < 0: self._picIndex = 0 self.flashMovie(self._picIndex)