def _load(self, path: str, keep_zoom: bool): """Load proper displayable QWidget for a path. This reads the image using QImageReader and then emits the appropriate *_loaded signal to tell the image to display a new object. """ try: reader = imagereader.get_reader(path) except ValueError as e: log.error(str(e)) return # SVG if reader.is_vectorgraphic and QtSvg is not None: # Do not store image and only emit with the path as the # VectorGraphic widget needs the path in the constructor api.signals.svg_loaded.emit(path, keep_zoom) self._edit_handler.clear() # Gif elif reader.is_animation: movie = QMovie(path) if not movie.isValid() or movie.frameCount() == 0: log.error("Error reading animation %s: invalid data", path) return api.signals.movie_loaded.emit(movie, keep_zoom) self._edit_handler.clear() # Regular image else: try: pixmap = reader.get_pixmap() except ValueError as e: log.error("%s", e) return self._edit_handler.pixmap = pixmap api.signals.pixmap_loaded.emit(pixmap, keep_zoom) self._path = path
def wxfinished(self): if self.wxreply.error() != QNetworkReply.NoError: print ("get radar error " + self.myname + ":" + \ str(self.wxreply.error())) self.lastwx = 0 return print("radar map received:" + self.myname + ":" + time.ctime()) self.wxmovie.stop() self.wxdata = QtCore.QByteArray(self.wxreply.readAll()) self.wxbuff = QtCore.QBuffer(self.wxdata) self.wxbuff.open(QtCore.QIODevice.ReadOnly) mov = QMovie(self.wxbuff, 'GIF') print ("radar map frame count:" + self.myname + ":" + \ str(mov.frameCount()) + ":r" + str(self.retries)) if mov.frameCount() > 2: self.lastwx = time.time() self.retries = 0 else: # radar image retreval failed if self.retries > 3: # give up, last successful animation stays. # the next normal radar_refresh time (default 10min) will apply self.lastwx = time.time() return self.lastwx = 0 # count retries self.retries = self.retries + 1 # retry in 5 seconds QtCore.QTimer.singleShot(5 * 1000, self.getwx) return self.wxmovie = mov if self.satellite: self.setMovie(self.wxmovie) else: self.wwx.setMovie(self.wxmovie) if self.parent().isVisible(): self.wxmovie.start()
def _load(self, path: str, reload_only: bool): """Load proper displayable QWidget for a path. This reads the image using QImageReader and then emits the appropriate *_loaded signal to tell the image to display a new object. """ # Pass file format explicitly as imghdr does a much better job at this than the # file name based approach of QImageReader file_format = files.imghdr.what(path) if file_format is None: log.error("%s is not a valid image", path) return reader = QImageReader(path, file_format.encode("utf-8")) reader.setAutoTransform(True) # Automatically apply exif orientation if not reader.canRead(): log.error("Cannot read image %s", path) return # SVG if file_format == "svg" and QSvgWidget: # Do not store image and only emit with the path as the # VectorGraphic widget needs the path in the constructor self.original = None api.signals.svg_loaded.emit(path, reload_only) self._image_type = ImageType.Svg # Gif elif reader.supportsAnimation(): movie = QMovie(path) if not movie.isValid() or movie.frameCount() == 0: log.error("Error reading animation %s: invalid data", path) return self.original = movie api.signals.movie_loaded.emit(self.current, reload_only) self._image_type = ImageType.Movie # Regular image else: pixmap = QPixmap.fromImageReader(reader) if reader.error(): log.error("Error reading image %s: %s", path, reader.errorString()) return self.original = pixmap api.signals.pixmap_loaded.emit(self.current, reload_only) self._image_type = ImageType.Pixmap self._path = path
class Load(QWidget): def __init__(self): super().__init__() self.movie = QMovie("load.gif", QByteArray(), self) size = self.size() screenGeometry = QDesktopWidget().screenGeometry(-1).size() self.setGeometry((screenGeometry.width() - size.width()) // 2, (screenGeometry.height() - size.height()) // 2, size.width(), size.height()) self.setWindowTitle('') self.movie_screen = QLabel() self.movie_screen.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.movie_screen.setAlignment(Qt.AlignCenter) main_layout = QVBoxLayout() main_layout.addWidget(self.movie_screen) self.setLayout(main_layout) self.movie.setCacheMode(QMovie.CacheAll) self.movie_screen.setMovie(self.movie) self.frame_count = self.movie.frameCount() self.movie.frameChanged.connect(self.frameChanged) self.frame = 0 self.setWindowFlags(Qt.FramelessWindowHint) self.setAttribute(Qt.WA_NoSystemBackground, True) self.setAttribute(Qt.WA_TranslucentBackground, True) self.movie.start() self.app = MainApp() self.movie.loopCount() def frameChanged(self): self.frame += 1 if self.frame >= self.frame_count: self.movie.stop() self.movie.setParent(None) self.movie.deleteLater() self.setAttribute(Qt.WA_NoSystemBackground, False) self.setAttribute(Qt.WA_TranslucentBackground, False) self.destroy() self.app.show()
class MoviePlayer(QWidget): def __init__(self, parent=None): super(MoviePlayer, self).__init__(parent) self.movie = QMovie(self) self.movie.setCacheMode(QMovie.CacheAll) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignCenter) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.movieLabel.setBackgroundRole(QPalette.Dark) self.movieLabel.setAutoFillBackground(True) self.currentMovieDirectory = '' self.createControls() self.createButtons() self.movie.frameChanged.connect(self.updateFrameSlider) self.movie.stateChanged.connect(self.updateButtons) self.fitCheckBox.clicked.connect(self.fitToWindow) self.frameSlider.valueChanged.connect(self.goToFrame) self.speedSpinBox.valueChanged.connect(self.movie.setSpeed) mainLayout = QVBoxLayout() mainLayout.addWidget(self.movieLabel) mainLayout.addLayout(self.controlsLayout) mainLayout.addLayout(self.buttonsLayout) self.setLayout(mainLayout) self.updateFrameSlider() self.updateButtons() self.setWindowTitle("Movie Player") self.resize(400, 400) def open(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie", self.currentMovieDirectory) if fileName: self.openFile(fileName) def openFile(self, fileName): self.currentMovieDirectory = QFileInfo(fileName).path() self.movie.stop() self.movieLabel.setMovie(self.movie) self.movie.setFileName(fileName) self.movie.start() self.updateFrameSlider() self.updateButtons() def goToFrame(self, frame): self.movie.jumpToFrame(frame) def fitToWindow(self): self.movieLabel.setScaledContents(self.fitCheckBox.isChecked()) def updateFrameSlider(self): hasFrames = (self.movie.currentFrameNumber() >= 0) if hasFrames: if self.movie.frameCount() > 0: self.frameSlider.setMaximum(self.movie.frameCount() - 1) elif self.movie.currentFrameNumber() > self.frameSlider.maximum(): self.frameSlider.setMaximum(self.movie.currentFrameNumber()) self.frameSlider.setValue(self.movie.currentFrameNumber()) else: self.frameSlider.setMaximum(0) self.frameLabel.setEnabled(hasFrames) self.frameSlider.setEnabled(hasFrames) def updateButtons(self): state = self.movie.state() self.playButton.setEnabled(self.movie.isValid() and self.movie.frameCount() != 1 and state == QMovie.NotRunning) self.pauseButton.setEnabled(state != QMovie.NotRunning) self.pauseButton.setChecked(state == QMovie.Paused) self.stopButton.setEnabled(state != QMovie.NotRunning) def createControls(self): self.fitCheckBox = QCheckBox("Fit to Window") self.frameLabel = QLabel("Current frame:") self.frameSlider = QSlider(Qt.Horizontal) self.frameSlider.setTickPosition(QSlider.TicksBelow) self.frameSlider.setTickInterval(10) speedLabel = QLabel("Speed:") self.speedSpinBox = QSpinBox() self.speedSpinBox.setRange(1, 9999) self.speedSpinBox.setValue(100) self.speedSpinBox.setSuffix("%") self.controlsLayout = QGridLayout() self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2) self.controlsLayout.addWidget(self.frameLabel, 1, 0) self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2) self.controlsLayout.addWidget(speedLabel, 2, 0) self.controlsLayout.addWidget(self.speedSpinBox, 2, 1) def createButtons(self): iconSize = QSize(36, 36) openButton = QToolButton() openButton.setIcon(self.style().standardIcon( QStyle.SP_DialogOpenButton)) openButton.setIconSize(iconSize) openButton.setToolTip("Open File") openButton.clicked.connect(self.open) self.playButton = QToolButton() self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.playButton.setIconSize(iconSize) self.playButton.setToolTip("Play") self.playButton.clicked.connect(self.movie.start) self.pauseButton = QToolButton() self.pauseButton.setCheckable(True) self.pauseButton.setIcon(self.style().standardIcon( QStyle.SP_MediaPause)) self.pauseButton.setIconSize(iconSize) self.pauseButton.setToolTip("Pause") self.pauseButton.clicked.connect(self.movie.setPaused) self.stopButton = QToolButton() self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) self.stopButton.setIconSize(iconSize) self.stopButton.setToolTip("Stop") self.stopButton.clicked.connect(self.movie.stop) quitButton = QToolButton() quitButton.setIcon(self.style().standardIcon( QStyle.SP_DialogCloseButton)) quitButton.setIconSize(iconSize) quitButton.setToolTip("Quit") quitButton.clicked.connect(self.close) self.buttonsLayout = QHBoxLayout() self.buttonsLayout.addStretch() self.buttonsLayout.addWidget(openButton) self.buttonsLayout.addWidget(self.playButton) self.buttonsLayout.addWidget(self.pauseButton) self.buttonsLayout.addWidget(self.stopButton) self.buttonsLayout.addWidget(quitButton) self.buttonsLayout.addStretch()
class Benek(Postac): def __init__(self, layout, move_distance=100, *args): super().__init__(layout, *args) self.clocks = [] self.load_player_config() self.set_player_geo() self.setText("") self.setPixmap(QtGui.QPixmap("images/skins/" + JsonConnector.get_from_config("skin") + ".png")) self.setScaledContents(True) # odpowiada za pozwolenie na skalowanie grafik self.move_distance = self.okno.gWidth / move_distance self.can_shot = True self.playing_sound = False self.rtimer = QTimer() self.clocks.append(self.rtimer) self.rtimer.timeout.connect(self.ruch_prawo) self.ltimer = QTimer() self.clocks.append(self.ltimer) self.ltimer.timeout.connect(self.ruch_lewo) self.shot_block_timer = QTimer() self.clocks.append(self.shot_block_timer) self.shot_block_timer.timeout.connect(self.shot_accuracy_unblock) self.make_move_animations() self.make_reload_bar() def load_player_config(self): config = JsonConnector.get_from_config("shipConfig") self.laser_penetrate = config["penetrate"] self.ship_size = config["shipSize"] self.fire_speed = config["fireSpeed"] self.ammo_size = config["ammoSize"] self.ammo_dist = config["ammoSpeed"] def set_player_geo(self): size = int(self.okno.gWidth/self.ship_size) self.setGeometry(QtCore.QRect((self.okno.width() - size)/2, self.okno.height() - size, size, size)) def rusz_benek_prawo(self): self.rtimer.start(15) self.pg = int((self.okno.width() - self.okno.gWidth) / 2 + self.okno.gWidth) # prawa granica self.x_ = self.geometry().x() self.move_sound_start() self.expand_anim_movie(self.lmove_anim) def ruch_prawo(self): if self.pg >= (self.x_ + self.width()): # zapezpiecza postać przed wyjściem poza okno if (self.pg - (self.x_ + self.width())) < self.move_distance: # jeśli odległość od lewego krańca jest mniejsza od ruchu to zmienia pozycje benka na krańcową self.x_ = self.pg - self.width() else: self.x_ += self.move_distance geo = QtCore.QRect(self.x_, self.geometry().y(), self.geometry().width(), self.geometry().height()) self.setGeometry(geo) def stop_rusz_benek_prawo(self): self.rtimer.stop() self.move_sound_stop() self.collapse_anim_movie(self.lmove_anim) def rusz_benek_lewo(self): self.ltimer.start(15) self.x_ = self.geometry().x() self.lg = int((self.okno.width() - self.okno.gWidth) / 2) # lewa granica self.move_sound_start() self.expand_anim_movie(self.rmove_anim) def ruch_lewo(self): if self.x_ > self.lg: # zabezpiecza przed wyjściem benka poza ekran if self.x_ - self.lg < self.move_distance: # jeśli benkowi brakuje mniej niż dystans ruchu to przyjmuje zerową pozycje self.x_ = self.lg else: self.x_ -= self.move_distance geo = QtCore.QRect(self.x_, self.geometry().y(), self.geometry().width(), self.geometry().height()) self.setGeometry(geo) def stop_rusz_benek_lewo(self): self.ltimer.stop() self.move_sound_stop() self.collapse_anim_movie(self.rmove_anim) def shot(self): # tworzy nowy strzał if self.can_shot: x = SoundThread("shotLaser.wav") x.start() self.ui.centralwidget.close() x = PlayerLaser(self.ui.centralwidget, cause_geo=self.geometry(), can_penetrate=self.laser_penetrate, bullet_width=self.ammo_size[0], bullet_height=self.ammo_size[1], bullet_distance=self.ammo_dist) # aby poprawnie dodać element do główneg widgetu należy go wyłączyć a następnie pokazać, czli zresetować self.ui.centralwidget.show() self.shot_accuracy_block() def shot_accuracy_block(self): self.can_shot = False self.shot_block_timer.start(self.fire_speed) self.movie.start() def shot_accuracy_unblock(self): self.can_shot = True self.shot_block_timer.stop() self.movie.stop() self.movie.jumpToFrame(self.movie.frameCount()-1) def move_sound_start(self): if not self.playing_sound: self.playing_sound = True self.move_sound = SoundThread("shotEngineNoise.wav", loop=True) self.clocks.append(self.move_sound) self.move_sound.start() def move_sound_stop(self): if self.playing_sound and not (self.ltimer.isActive() or self.rtimer.isActive()): self.move_sound.stop() self.clocks.remove(self.move_sound) self.playing_sound = False def make_reload_bar(self): self.reload_bar = QLabel(self) self.reload_bar.setGeometry(QtCore.QRect(int(self.width()/6), 0, int(self.width()/6), int(self.height()/2))) self.reload_bar.setText("aa") self.reload_bar.setPixmap(QtGui.QPixmap("images/reloadBar.gif")) self.reload_bar.setScaledContents(True) self.movie = QMovie("images/reloadBar.gif", QByteArray(), self.reload_bar) self.movie.setCacheMode(QMovie.CacheAll) self.movie.setSpeed(100 * 1000 / self.fire_speed) # ustala tak prędkość aby pokrywała się z szybkostrzelnością self.reload_bar.setMovie(self.movie) self.movie.jumpToFrame(self.movie.frameCount()-1) def make_move_animations(self): self.lmove_lab = QLabel(self) self.lmove_lab.setText("") self.lmove_lab.setGeometry(QtCore.QRect(0, 0, int(self.width() / 3), self.height())) self.lmove_lab.setScaledContents(True) self.lmove_anim = QMovie("images/lPlayerMove.gif", QByteArray(), self.lmove_lab) self.lmove_anim.setCacheMode(QMovie.CacheAll) self.lmove_anim.setSpeed(7000) self.lmove_lab.setMovie(self.lmove_anim) self.lmove_anim.jumpToFrame(0) self.rmove_lab = QLabel(self) self.rmove_lab.setText("") self.rmove_lab.setGeometry(QtCore.QRect(int(self.width() / 3*2), 0, int(self.width() / 3), self.height())) self.rmove_lab.setScaledContents(True) self.rmove_anim = QMovie("images/rPlayerMove.gif", QByteArray(), self.rmove_lab) self.rmove_anim.setCacheMode(QMovie.CacheAll) self.rmove_anim.setSpeed(7000) self.rmove_lab.setMovie(self.rmove_anim) self.rmove_anim.jumpToFrame(0) self.rmove_anim.frameCount() def expand_anim_movie(self, movie): movie.jumpToFrame(int(movie.frameCount() / 2)) def collapse_anim_movie(self, movie): movie.jumpToFrame(0)
class MainWindow(QMainWindow, Ui_GrilHappyQMW): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setupUi(self) self.setWindowTitle('Grils HappyToo!!!') self.setVisible(0) self.preloadDialog = QDialog() self.screen = QDesktopWidget().screenGeometry() """ gif开场动画 """ self.movie=QMovie(":/girl/img/showheart.gif") self.movie.updated.connect(self.gifFinished) self.movie.destroyed.connect(self.showMainWindow) self.movie.setSpeed(1111) """ 开场dialog """ self.preloadDialog.setWindowFlag(Qt.FramelessWindowHint) self.preloadDialog.setMask(QRegion(12,12,190,190)) self.preloadDialog.move(( self.screen.width()-200) / 2, ( self.screen.height()-200) / 2) gifLayout=QHBoxLayout() gifLabel=QLabel() gifLabel.setMovie(self.movie) gifLayout.addWidget(gifLabel) self.preloadDialog.setLayout(gifLayout) self.preloadDialog.setVisible(1) self.movie.start() def showMainWindow(self): self.move((self.screen.width() - self.width()) / 2, (self.screen.height() - self.height()) / 2) self.meidaPlayer=QMediaPlayer() self.playlist=QMediaPlaylist() self.playlist.setCurrentIndex(1); self.playlist.addMedia(QMediaContent(QUrl().fromLocalFile("video/Radio-Digital-Scheme-Live-Wallpaper~1.mp4"))) self.playlist.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop) self.meidaPlayer.setPlaylist(self.playlist) videoWidget = QVideoWidget() videoWidget.setAspectRatioMode(Qt.IgnoreAspectRatio) videoWidget.setAutoFillBackground(True) videoWidget.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)) # videoWidget.setMinimumSize(videoWidget.size()) self.meidaPlayer.setVideoOutput(videoWidget) self.verticalLayout_2.insertWidget(0,videoWidget) self.meidaPlayer.play() self.setVisible(1) def codeRain(self): label=QLabel(parent=self) s=''.join([word+'\n' for word in list("我们的每一天,都无法重来,将管理学书籍读遍依旧管不了因你悸动的心。")]) label.setText(s) label.raise_() label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)) label.setMaximumWidth(12) label.setMaximumHeight(len(s)*10) label.setMinimumHeight(len(s)*10) label.setWordWrap(True) label.setAlignment(Qt.AlignTop) label.setStyleSheet(""" font: 87 10pt "Arial"; color: rgb(0, 49, 79); """) label.setAttribute(Qt.WA_TranslucentBackground) label.show() ani=QPropertyAnimation(label, b'pos', self) ani.setDuration(10000) xr=random.randint(0,self.label.width()) yr=random.randint(0,self.height()) ani.setStartValue(QPoint(xr,-self.width())) ani.setEndValue(QPoint(xr,self.height())) ani.finished.connect(label.deleteLater) ani.start() def gifFinished(self): if(self.movie.currentFrameNumber()==self.movie.frameCount()-1): self.preloadDialog.close() self.movie.stop() self.showPreload() def showPreload(self): self.preloadDialog = QDialog() self.preloadImage=QPixmap(':/girl/img/preload.png') size = self.preloadImage.size() self.move(( self.screen.width() - size.width()) / 2, ( self.screen.height() - size.height()) / 2) self.preloadDialog.setMinimumSize(size) layout=QHBoxLayout() label=QLabel() label.setPixmap(self.preloadImage) layout.addWidget(label) self.preloadDialog.setLayout(layout) self.preloadDialog.setMask(QRegion(QRect(self.preloadImage.rect().x()+15,self.preloadImage.rect().y()+15,self.preloadImage.rect().width()-20,self.preloadImage.rect().height()-35))) self.timer = QTimer() self.preloadDialog.show() self.timer.timeout.connect(self.faded) self.timer.start(3000) self.timer.setInterval(10) self.opacity = 100 def faded(self): self.preloadDialog.setWindowOpacity(self.opacity / 100) if self.opacity <= 0: self.preloadDialog.close() """ 开启代码雨 """ self.showMainWindow() self.codeTimer=QTimer() self.codeTimer.timeout.connect(self.codeRain) self.codeTimer.start(1000) self.codeTimer.setInterval(5000) self.timer.stop() else: self.opacity -= 13 def closeEvent(self, a0) -> None: self.codeTimer.stop() for i in range(100,0,-1): self.setWindowOpacity(i/100) time.sleep(0.002)
class MoviePlayer(QWidget): def __init__(self, parent=None): super(MoviePlayer, self).__init__(parent) self.movie = QMovie(self) self.movie.setCacheMode(QMovie.CacheAll) self.movieLabel = QLabel("No movie loaded") self.movieLabel.setAlignment(Qt.AlignCenter) self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.movieLabel.setBackgroundRole(QPalette.Dark) self.movieLabel.setAutoFillBackground(True) self.currentMovieDirectory = '' self.createControls() self.createButtons() self.movie.frameChanged.connect(self.updateFrameSlider) self.movie.stateChanged.connect(self.updateButtons) self.fitCheckBox.clicked.connect(self.fitToWindow) self.frameSlider.valueChanged.connect(self.goToFrame) self.speedSpinBox.valueChanged.connect(self.movie.setSpeed) mainLayout = QVBoxLayout() mainLayout.addWidget(self.movieLabel) mainLayout.addLayout(self.controlsLayout) mainLayout.addLayout(self.buttonsLayout) self.setLayout(mainLayout) self.updateFrameSlider() self.updateButtons() self.setWindowTitle("Movie Player") self.resize(400, 400) def open(self): fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie", self.currentMovieDirectory) if fileName: self.openFile(fileName) def openFile(self, fileName): self.currentMovieDirectory = QFileInfo(fileName).path() self.movie.stop() self.movieLabel.setMovie(self.movie) self.movie.setFileName(fileName) self.movie.start() self.updateFrameSlider(); self.updateButtons(); def goToFrame(self, frame): self.movie.jumpToFrame(frame) def fitToWindow(self): self.movieLabel.setScaledContents(self.fitCheckBox.isChecked()) def updateFrameSlider(self): hasFrames = (self.movie.currentFrameNumber() >= 0) if hasFrames: if self.movie.frameCount() > 0: self.frameSlider.setMaximum(self.movie.frameCount() - 1) elif self.movie.currentFrameNumber() > self.frameSlider.maximum(): self.frameSlider.setMaximum(self.movie.currentFrameNumber()) self.frameSlider.setValue(self.movie.currentFrameNumber()) else: self.frameSlider.setMaximum(0) self.frameLabel.setEnabled(hasFrames) self.frameSlider.setEnabled(hasFrames) def updateButtons(self): state = self.movie.state() self.playButton.setEnabled(self.movie.isValid() and self.movie.frameCount() != 1 and state == QMovie.NotRunning) self.pauseButton.setEnabled(state != QMovie.NotRunning) self.pauseButton.setChecked(state == QMovie.Paused) self.stopButton.setEnabled(state != QMovie.NotRunning) def createControls(self): self.fitCheckBox = QCheckBox("Fit to Window") self.frameLabel = QLabel("Current frame:") self.frameSlider = QSlider(Qt.Horizontal) self.frameSlider.setTickPosition(QSlider.TicksBelow) self.frameSlider.setTickInterval(10) speedLabel = QLabel("Speed:") self.speedSpinBox = QSpinBox() self.speedSpinBox.setRange(1, 9999) self.speedSpinBox.setValue(100) self.speedSpinBox.setSuffix("%") self.controlsLayout = QGridLayout() self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2) self.controlsLayout.addWidget(self.frameLabel, 1, 0) self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2) self.controlsLayout.addWidget(speedLabel, 2, 0) self.controlsLayout.addWidget(self.speedSpinBox, 2, 1) def createButtons(self): iconSize = QSize(36, 36) openButton = QToolButton() openButton.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton)) openButton.setIconSize(iconSize) openButton.setToolTip("Open File") openButton.clicked.connect(self.open) self.playButton = QToolButton() self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) self.playButton.setIconSize(iconSize) self.playButton.setToolTip("Play") self.playButton.clicked.connect(self.movie.start) self.pauseButton = QToolButton() self.pauseButton.setCheckable(True) self.pauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause)) self.pauseButton.setIconSize(iconSize) self.pauseButton.setToolTip("Pause") self.pauseButton.clicked.connect(self.movie.setPaused) self.stopButton = QToolButton() self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop)) self.stopButton.setIconSize(iconSize) self.stopButton.setToolTip("Stop") self.stopButton.clicked.connect(self.movie.stop) quitButton = QToolButton() quitButton.setIcon(self.style().standardIcon(QStyle.SP_DialogCloseButton)) quitButton.setIconSize(iconSize) quitButton.setToolTip("Quit") quitButton.clicked.connect(self.close) self.buttonsLayout = QHBoxLayout() self.buttonsLayout.addStretch() self.buttonsLayout.addWidget(openButton) self.buttonsLayout.addWidget(self.playButton) self.buttonsLayout.addWidget(self.pauseButton) self.buttonsLayout.addWidget(self.stopButton) self.buttonsLayout.addWidget(quitButton) self.buttonsLayout.addStretch()
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)
class SlideshowMediaWindow(QDialog): def __init__(self, parent, area=None, *args, **kwargs): "parent: parent widget" "area: top-left-x(to screen), top-left-y(to screen), width, height" super(SlideshowMediaWindow, self).__init__(parent, *args, **kwargs) self.setWindowTitle("Slideshow External Media Window") sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.setSizePolicy(sizePolicy) self.setAttribute(Qt.WA_DeleteOnClose, on=True) self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint) self.setSizeGripEnabled(True) self.layout = QVBoxLayout() self.media_container = QLabel(self) self.media_container.setAttribute(Qt.WA_NativeWindow, on=True) # self.media_container.setFrameShape(QFrame.NoFrame) sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) sizePolicy.setHeightForWidth( self.media_container.sizePolicy().hasHeightForWidth()) self.media_container.setSizePolicy(sizePolicy) self.media_container.setAlignment(Qt.AlignCenter) self.media_container.setStyleSheet("background-color: black;") self.layout.addWidget(self.media_container) self.layout.setContentsMargins(1, 1, 1, 1) self.setLayout(self.layout) self.area = area if any(area): self.resize(area[2], area[3]) self.move(area[0], area[1]) else: self.resize(400, 300) self.mouse_pos = [0, 0] self.allow_resize_mouse_press = False self.pic_image = None self.media_container.setScaledContents(False) self.media_container.original_resizeEvent = self.media_container.resizeEvent def media_container_resizeEvent(event): if self.pic_image and isinstance(self.pic_image, QPixmap): if self.pic_image.width() > self.media_container.width() - 2 \ and self.pic_image.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.width() target_height = self.pic_image.height() scaled_image = self.pic_image.scaled( target_width, target_height, aspectRatioMode=Qt.KeepAspectRatio, transformMode=Qt.FastTransformation) self.media_container.setPixmap(scaled_image) elif self.pic_image and isinstance(self.pic_image, QMovie): if self.pic_image.original_size.width() > self.media_container.width() - 2 \ and self.pic_image.original_size.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.original_size.width() target_height = self.pic_image.original_size.height() scaled_size = self.pic_image.original_size.scaled( target_width, target_height, Qt.KeepAspectRatio) self.pic_image.setScaledSize(scaled_size) else: self.media_container.original_resizeEvent(event) self.media_container.resizeEvent = media_container_resizeEvent self.show() self.last_media_path = "" self.media_show_completed_notice = None # this should be a function to be called like self.stop_media_show() self.stop_media_show = lambda: None self.gif_completed_notice = threading.Event() def show_video(self, path): self.stop_media_show() self.media_container.clear() # some say the winId change all the time...so... mplayer_extended.setup(int(self.media_container.winId())) self.media_show_completed_notice = mplayer_extended.play(path) logger.debug("ext-media-win showed video: %s" % path) self.last_media_path = path self.stop_media_show = mplayer_extended.stop def show_pic(self, path): self.stop_media_show() self.media_container.clear() if not path.lower().endswith(".gif"): self.pic_image = QPixmap(path) if self.pic_image.width() > self.media_container.width() - 2 \ and self.pic_image.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.width() target_height = self.pic_image.height() scaled_image = self.pic_image.scaled( target_width, target_height, aspectRatioMode=Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation) self.media_container.setPixmap(scaled_image) logger.debug("ext-media-win showed pic: %s" % path) self.stop_media_show = lambda: None self.media_show_completed_notice = None else: self.last_media_path = path self.pic_image = QMovie(path, QByteArray(), self) if not self.pic_image.isValid(): self.media_show_completed_notice = None return self.pic_image.setCacheMode(QMovie.CacheAll) self.pic_image.jumpToNextFrame() self.pic_image.original_size = self.pic_image.currentPixmap().size( ) if self.pic_image.original_size.width() > self.media_container.width() - 2 \ and self.pic_image.original_size.height() > self.media_container.height() - 2: target_width = self.media_container.width() - 2 target_height = self.media_container.height() - 2 else: target_width = self.pic_image.original_size.width() target_height = self.pic_image.original_size.height() scaled_size = self.pic_image.original_size.scaled( target_width, target_height, Qt.KeepAspectRatio) self.pic_image.setScaledSize(scaled_size) self.pic_image.setSpeed(100) self.media_container.setMovie(self.pic_image) self.media_show_completed_notice = self.gif_completed_notice self.media_show_completed_notice.clear() def frameChanged_Handler(frameNumber): if frameNumber >= self.pic_image.frameCount() - 1: self.pic_image.stop() self.media_show_completed_notice.set() self.pic_image.frameChanged.connect(frameChanged_Handler) self.pic_image.start() logger.debug("ext-media-win showed gif: %s" % path) def stop_gif(): try: self.pic_image.stop() self.media_show_completed_notice.set() except Exception: pass self.stop_media_show = stop_gif def contextMenuEvent(self, event): m = QMenu(self) item = m.addAction("Stop Media") item.triggered.connect(self.stop_media_show) item = m.addAction("Exit Media Window") item.triggered.connect(self.close) m.popup(QCursor.pos()) def mousePressEvent(self, event): self.mouse_pos[0] = event.x() self.mouse_pos[1] = event.y() if event.globalX() < self.x() + self.frameGeometry().width() - 20 \ or event.globalY() < self.y() + self.frameGeometry().height() - 20: self.allow_resize_mouse_press = True else: self.allow_resize_mouse_press = True super().mousePressEvent(event) def mouseReleaseEvent(self, event): self.allow_resize_mouse_press = False super().mouseReleaseEvent(event) def mouseMoveEvent(self, event): if self.allow_resize_mouse_press: self.move(event.globalX() - self.mouse_pos[0], event.globalY() - self.mouse_pos[1]) super().mouseMoveEvent(event) def mouseDoubleClickEvent(self, event): self.setWindowState(self.windowState() ^ Qt.WindowFullScreen) super().mouseDoubleClickEvent(event) def keyPressEvent(self, event): if event.key() == Qt.Key_F11: self.setWindowState(self.windowState() ^ Qt.WindowFullScreen) else: super().keyPressEvent(event) def closeEvent(self, event): self.stop_media_show() self.area[0] = self.x() self.area[1] = self.y() self.area[2] = self.width() self.area[3] = self.height() event.accept()
class GIFItem(BaseItem): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.gesture_id = self.item_spec['id'] self.verbose_name = cn.GESTURES[self.gesture_id].verbose_name gif_path = cn.MODELS_FOLDER / f'{cn.GESTURES[self.gesture_id].slug}.gif' if not gif_path.exists(): raise ValueError(f'Missing gif at {gif_path}.') self.width = self.item_spec.get( 'width', cn.GIF_RECORDING_SIZE[0] * cn.GIF_DISPLAY_SIZE) self.height = self.item_spec.get( 'height', cn.GIF_RECORDING_SIZE[1] * cn.GIF_DISPLAY_SIZE) self.movie = QMovie(gif_path.as_posix()) self.gif_progress_bar = QProgressBar() def get_widget(self) -> Union[QWidget, None]: name_label = QLabel(self.verbose_name) name_label.setAlignment(Qt.AlignCenter) gif_label = QLabel() gif_label.setMovie(self.movie) self.movie.start() gif_label.setScaledContents(True) gif_label.setFixedSize(self.width, self.height) gif_label.setAlignment(Qt.AlignCenter) gif_label.setFrameStyle(QFrame.Panel) last_frame = self.movie.frameCount() - 1 self.gif_progress_bar.setMaximum(last_frame) def update_animation_progress(frame_index): try: self.gif_progress_bar.setValue(frame_index) if frame_index == last_frame: self.movie.setPaused(True) QTimer.singleShot(1000, lambda: self.movie.setPaused(False)) except RuntimeError: # This is a temporary fix, because the parent widget is deleted manually logger.debug('Gif Item Progress bar deleted before stopping.') self.movie.stop() self.movie.frameChanged.connect(update_animation_progress) GlobalEventFilter.get_instance().install_key_hook( Qt.Key_Space, self.replay_movie) layout = QVBoxLayout() layout.addWidget(name_label) layout.addWidget(gif_label) layout.addWidget(self.gif_progress_bar) layout.setSpacing(5) layout.setContentsMargins(0, 0, 0, 0) widget = QWidget() widget.setLayout(layout) widget.setFixedSize(self.width, self.height + 50) return widget def replay_movie(self, _, event: QEvent): key_event = QKeyEvent(event) if key_event.type( ) == QKeyEvent.KeyPress and not key_event.isAutoRepeat(): self.movie.stop() self.movie.start() effect = QGraphicsDropShadowEffect() effect.setBlurRadius(20) effect.setXOffset(0) effect.setYOffset(0) effect.setColor(Qt.red) self.gif_progress_bar.setGraphicsEffect(effect) if key_event.type() == QKeyEvent.KeyRelease: self.gif_progress_bar.setGraphicsEffect(None) def finish(self): self.movie.stop() GlobalEventFilter.get_instance().remove_key_hook( Qt.Key_Space, self.replay_movie)
class MainWindow(QMainWindow, Ui_GrilHappyQMW): """ 记录鼠标 """ mxPos1 = 0 myPos1 = 0 mxPos2 = 1 myPos2 = 1 r1 = 0 g1 = 0 b1 = 0 r2 = 159 g2 = 159 b2 = 159 myWheel = 255 def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setupUi(self) self.setWindowTitle('Grils HappyToo!!!') self.setVisible(0) self.preloadDialog = QDialog() self.screen = QDesktopWidget().screenGeometry() self.setMouseTracking(1) self.centralwidget.setMouseTracking(1) """ gif开场动画 """ if PRELOAD: self.movie = QMovie(":/girl/img/showheart.gif") self.movie.updated.connect(self.gifFinished) self.movie.destroyed.connect(self.showMainWindow) self.movie.setSpeed(100) """ 开场dialog """ self.preloadDialog.setWindowFlag(Qt.FramelessWindowHint) self.preloadDialog.move((self.screen.width() - 200) / 2, (self.screen.height() - 200) / 2) self.preloadDialog.setMinimumWidth(199) self.preloadDialog.setMinimumHeight(198) gifLayout = QHBoxLayout() gifLayout.setContentsMargins(0, 0, 0, 0) gifLayout.setSpacing(0) gifLabel = QLabel() gifLabel.setMovie(self.movie) gifLayout.addWidget(gifLabel) self.preloadDialog.setLayout(gifLayout) self.preloadDialog.setVisible(1) self.movie.start() else: self.showMainWindow() def showMainWindow(self): self.move((self.screen.width() - self.width()) / 2, (self.screen.height() - self.height()) / 2) self.meidaPlayer = QMediaPlayer() self.playlist = QMediaPlaylist() self.playlist.setCurrentIndex(1) self.playlist.addMedia( QMediaContent(QUrl().fromLocalFile( "video/Radio-Digital-Scheme-Live-Wallpaper~1.mp4"))) self.playlist.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop) self.meidaPlayer.setPlaylist(self.playlist) videoWidget = QVideoWidget() videoWidget.setAspectRatioMode(Qt.IgnoreAspectRatio) videoWidget.setAutoFillBackground(True) videoWidget.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) # videoWidget.setMinimumSize(videoWidget.size()) self.meidaPlayer.setVideoOutput(videoWidget) self.videoLayout.insertWidget(0, videoWidget) self.meidaPlayer.play() # self.pushButton_4.clicked.connect(self.showColorDialog) self.pushButton_4.installEventFilter(self) # self.pushButton.setGeometry() self.setVisible(1) def eventFilter(self, a0, a1) -> bool: if a1.type() == QtCore.QEvent.MouseButtonPress: self.pushButton_4.setStyleSheet(""" QPushButton#pushButton_4{ border:1px solid #ffffff; border-radius:2px; padding:10px 36px; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dadbde, stop: 1 #f6f7fa); color: rgb(255, 255, 255); } """) t = QTimer() t.timeout.connect(lambda: self.pushButton_4.setStyleSheet(""" QPushButton#pushButton_4{ border:1px solid #ffffff; border-radius:2px; padding:10px 36px; background-color: rgba(255, 255, 255, 0); color: rgb(255, 255, 255); } """)) t.start(50) t.setSingleShot(1) self.showColorDialog() return 1 else: return 0 def showColorDialog(self): #QColor QColorDialog::getColor(const QColor &initial = Qt::white, QWidget *parent = Q_NULLPTR, const QString &title = QString(), ColorDialogOptions options = ColorDialogOptions()) self.r1, self.g1, self.b1, a = QColorDialog().getColor( QColor(0, 0, 0), self, "选择第一种渐变颜色", QColorDialog.ShowAlphaChannel).getRgb() self.r2, self.g2, self.b2, a = QColorDialog().getColor( QColor(255, 255, 255), self, "选择第二种渐变颜色", QColorDialog.ShowAlphaChannel).getRgb() self.centralwidget.setStyleSheet(""" QWidget#centralwidget{background-color:qlineargradient(spread:pad, x1:%f, y1:%f, x2:%f, y2:%f, stop:0 rgba(%d, %d, %d, 255), stop:1 rgba(%d, %d, %d, %d)); }""" % (self.mxPos1, self.myPos1, self.mxPos2, self.myPos2, self.r1, self.g1, self.b1, self.r2, self.g2, self.b2, self.myWheel)) def wheelEvent(self, a0) -> None: angle = a0.angleDelta().y() / 8 if self.myWheel < 255 and angle > 0: self.myWheel += 1 elif self.myWheel > 0 and angle < 0: self.myWheel -= 1 self.centralwidget.setStyleSheet(""" QWidget#centralwidget{background-color:qlineargradient(spread:pad, x1:%f, y1:%f, x2:%f, y2:%f, stop:0 rgba(%d, %d, %d, 255), stop:1 rgba(%d, %d, %d, %d)); }""" % (self.mxPos1, self.myPos1, self.mxPos2, self.myPos2, self.r1, self.g1, self.b1, self.r2, self.g2, self.b2, self.myWheel)) def mousePressEvent(self, a0) -> None: """ 这里需要加上btn的..那个padding """ if not self.pushButton.geometry().contains(a0.pos()): label = QLabel(parent=self) self.centralwidget.setStyleSheet( """ QWidget#centralwidget{background-color:qlineargradient(spread:pad, x1:%f, y1:%f, x2:%f, y2:%f, stop:0 rgba(%d, %d, %d, 255), stop:1 rgba(%d, %d, %d, %d)); }""" % (self.mxPos1, self.myPos1, self.mxPos2, self.myPos2, self.r1, self.g1, self.b1, self.r2, self.g2, self.b2, self.myWheel)) if (a0.button() == Qt.LeftButton): self.mxPos1 = a0.x() / self.width() self.myPos1 = a0.y() / self.height() # s ="也许机器的语言不够浪漫, 但请相信我默默守候的心,千言浓情满天星万行代码与君依。" elif (a0.button() == Qt.RightButton): self.mxPos2 = a0.x() / self.width() self.myPos2 = a0.y() / self.height() s = "女生节快乐" label.setText(s) label.raise_() label.setMaximumWidth(13 * 6) label.setStyleSheet(""" font: 87 12pt "黑体"; color: rgb({}, {}, {}); """.format(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) label.setAttribute(Qt.WA_TranslucentBackground) label.show() ani = QPropertyAnimation(label, b'pos', self) ani.setDuration(2000) x = a0.pos().x() y = a0.pos().y() ani.setStartValue(QPoint(x, y)) ani.setEndValue(QPoint(x, y + 40)) ani.finished.connect(label.deleteLater) ani.start() def mouseMoveEvent(self, a0) -> None: label = QLabel(parent=self) s = random.choice("女生节快乐") label.setText(s) label.raise_() label.setMaximumWidth(13) label.setStyleSheet(""" font: 87 10pt "Arial"; color: rgba({}, {}, {},{}); """.format(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) label.setAttribute(Qt.WA_TranslucentBackground) label.show() ani = QPropertyAnimation(label, b'pos', self) ani.setDuration(500) x = a0.pos().x() y = a0.pos().y() rx = random.randint(-20, 20) ry = random.randint(-20, 20) ani.setStartValue(QPoint(x, y)) ani.setEndValue(QPoint(x + rx, y + ry)) ani.finished.connect(label.deleteLater) ani.start() def codeRain(self): label = QLabel(parent=self) s = ''.join([ word + '\n' for word in list("我们的每一天,都无法重来,将管理学书籍读遍依旧管不了因你悸动的心。") ]) label.setText(s) label.raise_() label.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) label.setMaximumWidth(12) label.setMaximumHeight(len(s) * 10) label.setMinimumHeight(len(s) * 10) label.setWordWrap(True) label.setAlignment(Qt.AlignTop) label.setStyleSheet(""" font: 87 10pt "Arial"; color: rgb(0, 49, 79); """) label.setAttribute(Qt.WA_TranslucentBackground) label.show() ani = QPropertyAnimation(label, b'pos', self) ani.setDuration(10000) xr = random.randint(0, self.label.width()) yr = random.randint(0, self.height()) ani.setStartValue(QPoint(xr, -self.width())) ani.setEndValue(QPoint(xr, self.height())) ani.finished.connect(label.deleteLater) ani.start() def gifFinished(self): if (self.movie.currentFrameNumber() == self.movie.frameCount() - 1): self.preloadDialog.close() self.movie.stop() self.showPreload() def showPreload(self): self.preloadDialog = QDialog() self.preloadImage = QPixmap(':/girl/img/preload.png') size = self.preloadImage.size() self.move((self.screen.width() - size.width()) / 2, (self.screen.height() - size.height()) / 2) self.preloadDialog.setMinimumSize(size) layout = QHBoxLayout() label = QLabel() label.setPixmap(self.preloadImage) layout.addWidget(label) self.preloadDialog.setLayout(layout) self.preloadDialog.setMask( QRegion( QRect(self.preloadImage.rect().x() + 15, self.preloadImage.rect().y() + 15, self.preloadImage.rect().width() - 20, self.preloadImage.rect().height() - 35))) self.timer = QTimer() self.preloadDialog.show() self.timer.timeout.connect(self.faded) self.timer.start(3000) self.timer.setInterval(50) self.opacity = 100 def faded(self): self.preloadDialog.setWindowOpacity(self.opacity / 100) if self.opacity <= 0: self.preloadDialog.close() self.showMainWindow() self.timer.stop() else: self.opacity -= 1 def closeEvent(self, a0) -> None: for i in range(100, 0, -1): self.setWindowOpacity(i / 100) time.sleep(0.002) self.close()